Mercurial > libavcodec.hg
annotate ffv1.c @ 11803:f443ef5ec4e2 libavcodec
Cosmetics: consistently apply K&R style.
Make me and Diego happy.
| author | stefano |
|---|---|
| date | Tue, 01 Jun 2010 08:07:15 +0000 |
| parents | 7dd2a45249a9 |
| children | 1acf2841dc5f |
| rev | line source |
|---|---|
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1 /* |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
2 * FFV1 codec for libavcodec |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
3 * |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
5 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
6 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
7 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
10 * License as published by the Free Software Foundation; either |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
12 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
16 * Lesser General Public License for more details. |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
17 * |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3777
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
21 */ |
| 2967 | 22 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
23 /** |
|
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11572
diff
changeset
|
24 * @file |
| 11527 | 25 * FF Video Codec 1 (a lossless codec) |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
26 */ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
27 |
|
4962
f99e40a7155b
Remove redundant #inclusion of common.h, avcodec.h already #includes it.
diego
parents:
4494
diff
changeset
|
28 #include "avcodec.h" |
| 9428 | 29 #include "get_bits.h" |
|
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
9355
diff
changeset
|
30 #include "put_bits.h" |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
31 #include "dsputil.h" |
| 2338 | 32 #include "rangecoder.h" |
| 1306 | 33 #include "golomb.h" |
|
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8590
diff
changeset
|
34 #include "mathops.h" |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
35 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
36 #define MAX_PLANES 4 |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
37 #define CONTEXT_SIZE 32 |
|
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
38 |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
39 extern const uint8_t ff_log2_run[32]; |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
40 |
| 1306 | 41 static const int8_t quant3[256]={ |
| 42 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
48 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
49 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
| 1306 | 50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, |
| 51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 53 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 54 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 55 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 56 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 57 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, | |
| 58 }; | |
| 9548 | 59 |
| 60 static const int8_t quant5_10bit[256]={ | |
| 61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, | |
| 62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 63 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 64 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 65 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 66 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 67 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 68 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 69 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 70 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 71 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 72 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 73 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1, | |
| 74 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 75 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 76 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0, | |
| 77 }; | |
| 78 | |
| 1306 | 79 static const int8_t quant5[256]={ |
| 80 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1306 | 82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 83 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 84 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 85 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 86 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 87 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 90 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 91 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 92 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 93 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 94 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 95 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1, | |
| 96 }; | |
| 97 static const int8_t quant7[256]={ | |
| 98 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 99 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 100 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 101 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 102 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 103 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 104 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 105 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 107 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 108 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 109 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 110 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 111 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2, | |
| 112 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 113 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1, | |
| 114 }; | |
| 115 static const int8_t quant9[256]={ | |
| 116 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 117 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 118 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 119 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 120 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 121 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 122 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 123 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 124 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 125 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 126 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 127 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 128 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 129 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 130 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, | |
| 131 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, | |
| 132 }; | |
| 9548 | 133 static const int8_t quant9_10bit[256]={ |
| 134 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, | |
| 135 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, | |
| 136 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 137 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 138 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 139 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 140 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 141 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 144 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 145 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 146 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3, | |
| 147 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 148 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 149 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0, | |
| 150 }; | |
| 151 | |
| 1306 | 152 static const int8_t quant11[256]={ |
| 153 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, | |
| 154 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 155 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 156 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 157 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 158 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 159 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 160 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 161 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 162 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 163 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 164 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 165 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 166 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4, | |
| 167 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 168 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, | |
| 169 }; | |
| 170 static const int8_t quant13[256]={ | |
| 171 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 172 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 173 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 174 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 175 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 176 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 177 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 178 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 179 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 180 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 181 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 182 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 183 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, | |
| 184 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 185 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 186 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1, | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
187 }; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
188 |
| 11572 | 189 static const uint8_t ver2_state[256]= { |
| 190 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49, | |
| 191 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39, | |
| 192 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52, | |
| 193 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69, | |
| 194 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97, | |
| 195 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98, | |
| 196 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125, | |
| 197 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129, | |
| 198 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148, | |
| 199 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160, | |
| 200 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178, | |
| 201 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196, | |
| 202 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214, | |
| 203 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225, | |
| 204 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242, | |
| 205 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255, | |
| 206 }; | |
| 207 | |
| 1306 | 208 typedef struct VlcState{ |
| 209 int16_t drift; | |
| 210 uint16_t error_sum; | |
| 211 int8_t bias; | |
| 212 uint8_t count; | |
| 213 } VlcState; | |
| 214 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
215 typedef struct PlaneContext{ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
216 int context_count; |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
217 uint8_t (*state)[CONTEXT_SIZE]; |
| 1306 | 218 VlcState *vlc_state; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
219 uint8_t interlace_bit_state[2]; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
220 } PlaneContext; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
221 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
222 typedef struct FFV1Context{ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
223 AVCodecContext *avctx; |
| 2338 | 224 RangeCoder c; |
| 1306 | 225 GetBitContext gb; |
| 226 PutBitContext pb; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
227 int version; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
228 int width, height; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
229 int chroma_h_shift, chroma_v_shift; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
230 int flags; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
231 int picture_number; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
232 AVFrame picture; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
233 int plane_count; |
|
10098
fef90da31453
Fix comments after switching from CABAC to range coder in r3658.
cehoyos
parents:
10048
diff
changeset
|
234 int ac; ///< 1=range coder <-> 0=golomb rice |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
235 PlaneContext plane[MAX_PLANES]; |
| 1306 | 236 int16_t quant_table[5][256]; |
| 11572 | 237 uint8_t state_transition[256]; |
| 1593 | 238 int run_index; |
| 239 int colorspace; | |
| 2967 | 240 |
| 241 DSPContext dsp; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
242 }FFV1Context; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
243 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4001
diff
changeset
|
244 static av_always_inline int fold(int diff, int bits){ |
| 1593 | 245 if(bits==8) |
| 246 diff= (int8_t)diff; | |
| 247 else{ | |
| 248 diff+= 1<<(bits-1); | |
| 249 diff&=(1<<bits)-1; | |
| 250 diff-= 1<<(bits-1); | |
| 251 } | |
| 252 | |
| 253 return diff; | |
| 254 } | |
| 255 | |
| 256 static inline int predict(int_fast16_t *src, int_fast16_t *last){ | |
| 1306 | 257 const int LT= last[-1]; |
| 258 const int T= last[ 0]; | |
| 259 const int L = src[-1]; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
260 |
| 1360 | 261 return mid_pred(L, L + T - LT, T); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
262 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
263 |
| 1593 | 264 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){ |
| 1306 | 265 const int LT= last[-1]; |
| 266 const int T= last[ 0]; | |
| 267 const int RT= last[ 1]; | |
| 268 const int L = src[-1]; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
269 |
| 1306 | 270 if(f->quant_table[3][127]){ |
| 271 const int TT= last2[0]; | |
| 272 const int LL= src[-2]; | |
| 273 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF] | |
| 274 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF]; | |
| 275 }else | |
| 276 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
277 } |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
278 |
|
9547
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
279 static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
280 int i; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
281 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
282 if(v){ |
| 4001 | 283 const int a= FFABS(v); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
284 const int e= av_log2(a); |
| 2338 | 285 put_rac(c, state+0, 0); |
| 9548 | 286 if(e<=9){ |
| 9552 | 287 for(i=0; i<e; i++){ |
| 288 put_rac(c, state+1+i, 1); //1..10 | |
| 289 } | |
| 290 put_rac(c, state+1+i, 0); | |
| 2339 | 291 |
| 9552 | 292 for(i=e-1; i>=0; i--){ |
| 293 put_rac(c, state+22+i, (a>>i)&1); //22..31 | |
| 294 } | |
|
1336
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
295 |
| 9552 | 296 if(is_signed) |
| 297 put_rac(c, state+11 + e, v < 0); //11..21 | |
| 9548 | 298 }else{ |
| 299 for(i=0; i<e; i++){ | |
| 300 put_rac(c, state+1+FFMIN(i,9), 1); //1..10 | |
| 301 } | |
| 302 put_rac(c, state+1+9, 0); | |
| 303 | |
| 304 for(i=e-1; i>=0; i--){ | |
| 305 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31 | |
| 306 } | |
| 307 | |
| 308 if(is_signed) | |
| 309 put_rac(c, state+11 + 10, v < 0); //11..21 | |
| 310 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
311 }else{ |
| 2338 | 312 put_rac(c, state+0, 1); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
313 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
314 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
315 |
|
9547
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
316 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){ |
|
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
317 put_symbol_inline(c, state, v, is_signed); |
|
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
318 } |
|
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
319 |
| 9548 | 320 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){ |
| 2338 | 321 if(get_rac(c, state+0)) |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
322 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
323 else{ |
| 2339 | 324 int i, e, a; |
| 325 e= 0; | |
| 9548 | 326 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10 |
| 2339 | 327 e++; |
| 328 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
329 |
| 2339 | 330 a= 1; |
| 331 for(i=e-1; i>=0; i--){ | |
| 9548 | 332 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31 |
| 2339 | 333 } |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
334 |
| 9548 | 335 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21 |
| 9546 | 336 return (a^e)-e; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
337 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
338 } |
| 1306 | 339 |
|
9547
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
340 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ |
|
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
341 return get_symbol_inline(c, state, is_signed); |
|
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
342 } |
|
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
343 |
| 1306 | 344 static inline void update_vlc_state(VlcState * const state, const int v){ |
| 345 int drift= state->drift; | |
| 346 int count= state->count; | |
| 4001 | 347 state->error_sum += FFABS(v); |
| 1306 | 348 drift += v; |
| 349 | |
| 350 if(count == 128){ //FIXME variable | |
| 351 count >>= 1; | |
| 352 drift >>= 1; | |
| 353 state->error_sum >>= 1; | |
| 354 } | |
| 355 count++; | |
| 356 | |
| 357 if(drift <= -count){ | |
| 358 if(state->bias > -128) state->bias--; | |
| 2967 | 359 |
| 1306 | 360 drift += count; |
| 361 if(drift <= -count) | |
| 362 drift= -count + 1; | |
| 363 }else if(drift > 0){ | |
| 364 if(state->bias < 127) state->bias++; | |
| 2967 | 365 |
| 1306 | 366 drift -= count; |
| 2967 | 367 if(drift > 0) |
| 1306 | 368 drift= 0; |
| 369 } | |
| 370 | |
| 371 state->drift= drift; | |
| 372 state->count= count; | |
| 373 } | |
| 374 | |
| 1593 | 375 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){ |
| 1306 | 376 int i, k, code; |
| 377 //printf("final: %d ", v); | |
| 1593 | 378 v = fold(v - state->bias, bits); |
| 379 | |
| 1306 | 380 i= state->count; |
| 381 k=0; | |
| 382 while(i < state->error_sum){ //FIXME optimize | |
| 383 k++; | |
| 384 i += i; | |
| 385 } | |
|
1361
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
386 |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
387 assert(k<=8); |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
388 |
| 1306 | 389 #if 0 // JPEG LS |
| 390 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1); | |
| 391 else code= v; | |
| 392 #else | |
| 393 code= v ^ ((2*state->drift + state->count)>>31); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
394 #endif |
| 2967 | 395 |
| 1306 | 396 //printf("v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code, state->bias, state->error_sum, state->drift, state->count, k); |
| 2220 | 397 set_sr_golomb(pb, code, k, 12, bits); |
| 1306 | 398 |
| 399 update_vlc_state(state, v); | |
| 400 } | |
| 401 | |
| 1593 | 402 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){ |
| 1306 | 403 int k, i, v, ret; |
| 404 | |
| 405 i= state->count; | |
| 406 k=0; | |
| 407 while(i < state->error_sum){ //FIXME optimize | |
| 408 k++; | |
| 409 i += i; | |
| 410 } | |
|
1361
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
411 |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
412 assert(k<=8); |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
413 |
| 2220 | 414 v= get_sr_golomb(gb, k, 12, bits); |
| 1306 | 415 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k); |
|
1361
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
416 |
| 1306 | 417 #if 0 // JPEG LS |
| 418 if(k==0 && 2*state->drift <= - state->count) v ^= (-1); | |
| 419 #else | |
| 420 v ^= ((2*state->drift + state->count)>>31); | |
| 421 #endif | |
| 422 | |
| 1593 | 423 ret= fold(v + state->bias, bits); |
| 2967 | 424 |
| 1306 | 425 update_vlc_state(state, v); |
| 426 //printf("final: %d\n", ret); | |
| 427 return ret; | |
| 428 } | |
| 429 | |
| 8590 | 430 #if CONFIG_FFV1_ENCODER |
| 2422 | 431 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
432 PlaneContext * const p= &s->plane[plane_index]; |
| 2338 | 433 RangeCoder * const c= &s->c; |
| 1593 | 434 int x; |
| 435 int run_index= s->run_index; | |
| 436 int run_count=0; | |
| 437 int run_mode=0; | |
| 438 | |
| 2422 | 439 if(s->ac){ |
| 440 if(c->bytestream_end - c->bytestream < w*20){ | |
| 441 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
| 442 return -1; | |
| 443 } | |
| 444 }else{ | |
| 445 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){ | |
| 446 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
| 447 return -1; | |
| 448 } | |
| 449 } | |
| 450 | |
| 1593 | 451 for(x=0; x<w; x++){ |
| 452 int diff, context; | |
| 2967 | 453 |
| 1999 | 454 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x); |
| 455 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x); | |
| 1593 | 456 |
| 457 if(context < 0){ | |
| 458 context = -context; | |
| 459 diff= -diff; | |
| 460 } | |
| 461 | |
| 462 diff= fold(diff, bits); | |
| 2967 | 463 |
| 1593 | 464 if(s->ac){ |
|
9547
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
465 put_symbol_inline(c, p->state[context], diff, 1); |
| 1593 | 466 }else{ |
| 467 if(context == 0) run_mode=1; | |
| 2967 | 468 |
| 1593 | 469 if(run_mode){ |
| 470 | |
| 471 if(diff){ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
472 while(run_count >= 1<<ff_log2_run[run_index]){ |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
473 run_count -= 1<<ff_log2_run[run_index]; |
| 1593 | 474 run_index++; |
| 475 put_bits(&s->pb, 1, 1); | |
| 476 } | |
| 2967 | 477 |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
478 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count); |
| 1593 | 479 if(run_index) run_index--; |
| 480 run_count=0; | |
| 481 run_mode=0; | |
| 482 if(diff>0) diff--; | |
| 483 }else{ | |
| 484 run_count++; | |
| 485 } | |
| 486 } | |
| 2967 | 487 |
| 1786 | 488 // printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, (int)put_bits_count(&s->pb)); |
| 1593 | 489 |
| 490 if(run_mode == 0) | |
| 491 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits); | |
| 492 } | |
| 493 } | |
| 494 if(run_mode){ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
495 while(run_count >= 1<<ff_log2_run[run_index]){ |
|
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
496 run_count -= 1<<ff_log2_run[run_index]; |
| 1593 | 497 run_index++; |
| 498 put_bits(&s->pb, 1, 1); | |
| 499 } | |
| 500 | |
| 501 if(run_count) | |
| 502 put_bits(&s->pb, 1, 1); | |
| 503 } | |
| 504 s->run_index= run_index; | |
| 2967 | 505 |
| 2422 | 506 return 0; |
| 1593 | 507 } |
| 508 | |
| 509 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | |
| 1999 | 510 int x,y,i; |
| 2162 | 511 const int ring_size= s->avctx->context_model ? 3 : 2; |
| 1999 | 512 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size]; |
| 1593 | 513 s->run_index=0; |
| 2967 | 514 |
| 1337 | 515 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 516 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
517 for(y=0; y<h; y++){ |
| 1999 | 518 for(i=0; i<ring_size; i++) |
| 519 sample[i]= sample_buffer[(h+i-y)%ring_size]+3; | |
| 2967 | 520 |
| 1999 | 521 sample[0][-1]= sample[1][0 ]; |
| 522 sample[1][ w]= sample[1][w-1]; | |
| 1593 | 523 //{START_TIMER |
| 9548 | 524 if(s->avctx->bits_per_raw_sample<=8){ |
| 9552 | 525 for(x=0; x<w; x++){ |
| 526 sample[0][x]= src[x + stride*y]; | |
| 527 } | |
| 528 encode_line(s, w, sample, plane_index, 8); | |
| 9548 | 529 }else{ |
| 530 for(x=0; x<w; x++){ | |
| 531 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample); | |
| 532 } | |
| 533 encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample); | |
| 534 } | |
| 1593 | 535 //STOP_TIMER("encode line")} |
| 536 } | |
| 537 } | |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
538 |
| 1593 | 539 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ |
| 1999 | 540 int x, y, p, i; |
| 2162 | 541 const int ring_size= s->avctx->context_model ? 3 : 2; |
| 1999 | 542 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size]; |
| 1593 | 543 s->run_index=0; |
| 2967 | 544 |
| 1593 | 545 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 546 |
| 1593 | 547 for(y=0; y<h; y++){ |
| 1999 | 548 for(i=0; i<ring_size; i++) |
| 549 for(p=0; p<3; p++) | |
| 550 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3; | |
| 551 | |
| 1593 | 552 for(x=0; x<w; x++){ |
| 553 int v= src[x + stride*y]; | |
| 554 int b= v&0xFF; | |
| 555 int g= (v>>8)&0xFF; | |
| 556 int r= (v>>16)&0xFF; | |
| 2967 | 557 |
| 1593 | 558 b -= g; |
| 559 r -= g; | |
| 560 g += (b + r)>>2; | |
| 561 b += 0x100; | |
| 562 r += 0x100; | |
| 2967 | 563 |
| 1593 | 564 // assert(g>=0 && b>=0 && r>=0); |
| 565 // assert(g<256 && b<512 && r<512); | |
| 566 sample[0][0][x]= g; | |
| 567 sample[1][0][x]= b; | |
| 568 sample[2][0][x]= r; | |
| 569 } | |
| 570 for(p=0; p<3; p++){ | |
| 1999 | 571 sample[p][0][-1]= sample[p][1][0 ]; |
| 572 sample[p][1][ w]= sample[p][1][w-1]; | |
| 1593 | 573 encode_line(s, w, sample[p], FFMIN(p, 1), 9); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
574 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
575 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
576 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
577 |
| 2338 | 578 static void write_quant_table(RangeCoder *c, int16_t *quant_table){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
579 int last=0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
580 int i; |
| 2338 | 581 uint8_t state[CONTEXT_SIZE]; |
| 582 memset(state, 128, sizeof(state)); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
583 |
| 1306 | 584 for(i=1; i<128 ; i++){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
585 if(quant_table[i] != quant_table[i-1]){ |
| 2339 | 586 put_symbol(c, state, i-last-1, 0); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
587 last= i; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
588 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
589 } |
| 2339 | 590 put_symbol(c, state, i-last-1, 0); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
591 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
592 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
593 static void write_header(FFV1Context *f){ |
| 2338 | 594 uint8_t state[CONTEXT_SIZE]; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
595 int i; |
| 2338 | 596 RangeCoder * const c= &f->c; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
597 |
| 2338 | 598 memset(state, 128, sizeof(state)); |
| 2967 | 599 |
| 2339 | 600 put_symbol(c, state, f->version, 0); |
| 11572 | 601 put_symbol(c, state, f->ac, 0); |
| 602 if(f->ac>1){ | |
| 603 for(i=1; i<256; i++){ | |
| 604 f->state_transition[i]=ver2_state[i]; | |
| 605 put_symbol(c, state, ver2_state[i] - c->one_state[i], 1); | |
| 606 } | |
| 607 } | |
| 2967 | 608 put_symbol(c, state, f->colorspace, 0); //YUV cs type |
| 9548 | 609 if(f->version>0) |
| 610 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0); | |
| 2338 | 611 put_rac(c, state, 1); //chroma planes |
| 2339 | 612 put_symbol(c, state, f->chroma_h_shift, 0); |
| 613 put_symbol(c, state, f->chroma_v_shift, 0); | |
| 2338 | 614 put_rac(c, state, 0); //no transparency plane |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
615 |
| 1306 | 616 for(i=0; i<5; i++) |
| 617 write_quant_table(c, f->quant_table[i]); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
618 } |
|
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7146
diff
changeset
|
619 #endif /* CONFIG_FFV1_ENCODER */ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
620 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
621 static av_cold int common_init(AVCodecContext *avctx){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
622 FFV1Context *s = avctx->priv_data; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
623 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
624 s->avctx= avctx; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
625 s->flags= avctx->flags; |
| 2967 | 626 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
627 dsputil_init(&s->dsp, avctx); |
| 2967 | 628 |
|
9468
71608a4f9eb7
Remove 2 unneeded variables from common_init() found by CSA.
michael
parents:
9428
diff
changeset
|
629 s->width = avctx->width; |
|
71608a4f9eb7
Remove 2 unneeded variables from common_init() found by CSA.
michael
parents:
9428
diff
changeset
|
630 s->height= avctx->height; |
| 2967 | 631 |
|
9468
71608a4f9eb7
Remove 2 unneeded variables from common_init() found by CSA.
michael
parents:
9428
diff
changeset
|
632 assert(s->width && s->height); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
633 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
634 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
635 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
636 |
| 8590 | 637 #if CONFIG_FFV1_ENCODER |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
638 static av_cold int encode_init(AVCodecContext *avctx) |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
639 { |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
640 FFV1Context *s = avctx->priv_data; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
641 int i; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
642 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
643 common_init(avctx); |
| 2967 | 644 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
645 s->version=0; |
| 11572 | 646 s->ac= avctx->coder_type ? 2:0; |
| 2967 | 647 |
|
1345
daf951f32697
merge U and V statistics, 33% reduction in memory requirement, compression rate better for some files worse for others, worst compression rate loss 0.05%
michaelni
parents:
1337
diff
changeset
|
648 s->plane_count=2; |
| 1306 | 649 for(i=0; i<256; i++){ |
| 9548 | 650 if(avctx->bits_per_raw_sample <=8){ |
| 9552 | 651 s->quant_table[0][i]= quant11[i]; |
| 652 s->quant_table[1][i]= 11*quant11[i]; | |
| 653 if(avctx->context_model==0){ | |
| 654 s->quant_table[2][i]= 11*11*quant11[i]; | |
| 655 s->quant_table[3][i]= | |
| 656 s->quant_table[4][i]=0; | |
| 657 }else{ | |
| 658 s->quant_table[2][i]= 11*11*quant5 [i]; | |
| 659 s->quant_table[3][i]= 5*11*11*quant5 [i]; | |
| 660 s->quant_table[4][i]= 5*5*11*11*quant5 [i]; | |
| 661 } | |
| 9548 | 662 }else{ |
| 663 s->quant_table[0][i]= quant9_10bit[i]; | |
| 664 s->quant_table[1][i]= 11*quant9_10bit[i]; | |
| 665 if(avctx->context_model==0){ | |
| 666 s->quant_table[2][i]= 11*11*quant9_10bit[i]; | |
| 667 s->quant_table[3][i]= | |
| 668 s->quant_table[4][i]=0; | |
| 669 }else{ | |
| 670 s->quant_table[2][i]= 11*11*quant5_10bit[i]; | |
| 671 s->quant_table[3][i]= 5*11*11*quant5_10bit[i]; | |
| 672 s->quant_table[4][i]= 5*5*11*11*quant5_10bit[i]; | |
| 673 } | |
| 674 } | |
| 1306 | 675 } |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
676 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
677 for(i=0; i<s->plane_count; i++){ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
678 PlaneContext * const p= &s->plane[i]; |
| 2967 | 679 |
| 1306 | 680 if(avctx->context_model==0){ |
| 681 p->context_count= (11*11*11+1)/2; | |
| 2967 | 682 }else{ |
| 1306 | 683 p->context_count= (11*11*5*5*5+1)/2; |
| 684 } | |
| 685 | |
| 686 if(s->ac){ | |
| 687 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); | |
| 688 }else{ | |
| 689 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); | |
| 690 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
691 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
692 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
693 avctx->coded_frame= &s->picture; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
694 switch(avctx->pix_fmt){ |
| 9548 | 695 case PIX_FMT_YUV444P16: |
| 696 case PIX_FMT_YUV422P16: | |
| 697 case PIX_FMT_YUV420P16: | |
| 698 if(avctx->bits_per_raw_sample <=8){ | |
| 10048 | 699 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n"); |
| 9548 | 700 return -1; |
| 701 } | |
|
11530
86e4be64519e
Disallow VLC coding with more than 8 bits as there are several bugs
michael
parents:
11529
diff
changeset
|
702 if(!s->ac){ |
|
86e4be64519e
Disallow VLC coding with more than 8 bits as there are several bugs
michael
parents:
11529
diff
changeset
|
703 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n"); |
|
86e4be64519e
Disallow VLC coding with more than 8 bits as there are several bugs
michael
parents:
11529
diff
changeset
|
704 return -1; |
|
86e4be64519e
Disallow VLC coding with more than 8 bits as there are several bugs
michael
parents:
11529
diff
changeset
|
705 } |
| 9548 | 706 s->version= 1; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
707 case PIX_FMT_YUV444P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
708 case PIX_FMT_YUV422P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
709 case PIX_FMT_YUV420P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
710 case PIX_FMT_YUV411P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
711 case PIX_FMT_YUV410P: |
| 1593 | 712 s->colorspace= 0; |
| 713 break; | |
|
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4283
diff
changeset
|
714 case PIX_FMT_RGB32: |
| 1593 | 715 s->colorspace= 1; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
716 break; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
717 default: |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
718 av_log(avctx, AV_LOG_ERROR, "format not supported\n"); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
719 return -1; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
720 } |
| 1593 | 721 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); |
| 722 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
723 s->picture_number=0; |
| 2967 | 724 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
725 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
726 } |
|
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7146
diff
changeset
|
727 #endif /* CONFIG_FFV1_ENCODER */ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
728 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
729 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
730 static void clear_state(FFV1Context *f){ |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
731 int i, j; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
732 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
733 for(i=0; i<f->plane_count; i++){ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
734 PlaneContext *p= &f->plane[i]; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
735 |
| 2338 | 736 p->interlace_bit_state[0]= 128; |
| 737 p->interlace_bit_state[1]= 128; | |
| 2967 | 738 |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
739 for(j=0; j<p->context_count; j++){ |
| 1306 | 740 if(f->ac){ |
| 2338 | 741 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE); |
| 1306 | 742 }else{ |
| 743 p->vlc_state[j].drift= 0; | |
| 744 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2); | |
| 745 p->vlc_state[j].bias= 0; | |
| 746 p->vlc_state[j].count= 1; | |
| 747 } | |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
748 } |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
749 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
750 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
751 |
| 8590 | 752 #if CONFIG_FFV1_ENCODER |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
753 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
754 FFV1Context *f = avctx->priv_data; |
| 2338 | 755 RangeCoder * const c= &f->c; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
756 AVFrame *pict = data; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
757 const int width= f->width; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
758 const int height= f->height; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
759 AVFrame * const p= &f->picture; |
| 1306 | 760 int used_count= 0; |
| 2338 | 761 uint8_t keystate=128; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
762 |
| 2338 | 763 ff_init_range_encoder(c, buf, buf_size); |
| 764 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
| 765 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
766 *p = *pict; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
767 p->pict_type= FF_I_TYPE; |
| 2967 | 768 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
769 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){ |
| 2338 | 770 put_rac(c, &keystate, 1); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
771 p->key_frame= 1; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
772 write_header(f); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
773 clear_state(f); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
774 }else{ |
| 2338 | 775 put_rac(c, &keystate, 0); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
776 p->key_frame= 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
777 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
778 |
| 1306 | 779 if(!f->ac){ |
| 2338 | 780 used_count += ff_rac_terminate(c); |
| 1306 | 781 //printf("pos=%d\n", used_count); |
|
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1453
diff
changeset
|
782 init_put_bits(&f->pb, buf + used_count, buf_size - used_count); |
| 11572 | 783 }else if (f->ac>1){ |
| 784 int i; | |
| 785 for(i=1; i<256; i++){ | |
| 786 c->one_state[i]= f->state_transition[i]; | |
| 787 c->zero_state[256-i]= 256-c->one_state[i]; | |
| 788 } | |
| 1306 | 789 } |
| 2967 | 790 |
| 1593 | 791 if(f->colorspace==0){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
792 const int chroma_width = -((-width )>>f->chroma_h_shift); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
793 const int chroma_height= -((-height)>>f->chroma_v_shift); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
794 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
795 encode_plane(f, p->data[0], width, height, p->linesize[0], 0); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
796 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
797 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1); |
|
1345
daf951f32697
merge U and V statistics, 33% reduction in memory requirement, compression rate better for some files worse for others, worst compression rate loss 0.05%
michaelni
parents:
1337
diff
changeset
|
798 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1); |
| 1593 | 799 }else{ |
| 800 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
801 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
802 emms_c(); |
| 2967 | 803 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
804 f->picture_number++; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
805 |
| 1306 | 806 if(f->ac){ |
| 2338 | 807 return ff_rac_terminate(c); |
| 1306 | 808 }else{ |
| 809 flush_put_bits(&f->pb); //nicer padding FIXME | |
| 1786 | 810 return used_count + (put_bits_count(&f->pb)+7)/8; |
| 1306 | 811 } |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
812 } |
|
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7146
diff
changeset
|
813 #endif /* CONFIG_FFV1_ENCODER */ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
814 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
815 static av_cold int common_end(AVCodecContext *avctx){ |
| 3283 | 816 FFV1Context *s = avctx->priv_data; |
| 2967 | 817 int i; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
818 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
819 for(i=0; i<s->plane_count; i++){ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
820 PlaneContext *p= &s->plane[i]; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
821 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
822 av_freep(&p->state); |
| 5222 | 823 av_freep(&p->vlc_state); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
824 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
825 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
826 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
827 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
828 |
|
9547
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
829 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
830 PlaneContext * const p= &s->plane[plane_index]; |
| 2338 | 831 RangeCoder * const c= &s->c; |
| 1593 | 832 int x; |
| 833 int run_count=0; | |
| 834 int run_mode=0; | |
| 835 int run_index= s->run_index; | |
| 836 | |
| 837 for(x=0; x<w; x++){ | |
| 838 int diff, context, sign; | |
| 2967 | 839 |
| 1593 | 840 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x); |
| 841 if(context < 0){ | |
| 842 context= -context; | |
| 843 sign=1; | |
| 844 }else | |
| 845 sign=0; | |
| 2967 | 846 |
| 1593 | 847 |
| 2339 | 848 if(s->ac){ |
|
9547
df1827eb3aaa
Force speed irrelevant calls to get/put_symbol() to be noinline.
michael
parents:
9546
diff
changeset
|
849 diff= get_symbol_inline(c, p->state[context], 1); |
| 2339 | 850 }else{ |
| 1593 | 851 if(context == 0 && run_mode==0) run_mode=1; |
| 2967 | 852 |
| 1593 | 853 if(run_mode){ |
| 854 if(run_count==0 && run_mode==1){ | |
| 855 if(get_bits1(&s->gb)){ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
856 run_count = 1<<ff_log2_run[run_index]; |
| 1593 | 857 if(x + run_count <= w) run_index++; |
| 858 }else{ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
859 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]); |
| 1593 | 860 else run_count=0; |
| 861 if(run_index) run_index--; | |
| 862 run_mode=2; | |
| 863 } | |
| 864 } | |
| 865 run_count--; | |
| 866 if(run_count < 0){ | |
| 867 run_mode=0; | |
| 868 run_count=0; | |
| 869 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits); | |
| 870 if(diff>=0) diff++; | |
| 871 }else | |
| 872 diff=0; | |
| 873 }else | |
| 874 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits); | |
| 2967 | 875 |
| 1593 | 876 // printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, get_bits_count(&s->gb)); |
| 877 } | |
| 878 | |
| 879 if(sign) diff= -diff; | |
| 880 | |
| 881 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1); | |
| 882 } | |
| 2967 | 883 s->run_index= run_index; |
| 1593 | 884 } |
| 885 | |
| 886 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | |
| 887 int x, y; | |
| 888 int_fast16_t sample_buffer[2][w+6]; | |
| 6847 | 889 int_fast16_t *sample[2]; |
| 890 sample[0]=sample_buffer[0]+3; | |
| 891 sample[1]=sample_buffer[1]+3; | |
| 1593 | 892 |
| 893 s->run_index=0; | |
| 2967 | 894 |
| 1337 | 895 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 896 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
897 for(y=0; y<h; y++){ |
| 1593 | 898 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
899 |
| 1337 | 900 sample[0]= sample[1]; |
| 901 sample[1]= temp; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
902 |
| 1337 | 903 sample[1][-1]= sample[0][0 ]; |
| 904 sample[0][ w]= sample[0][w-1]; | |
| 2967 | 905 |
| 1593 | 906 //{START_TIMER |
| 9548 | 907 if(s->avctx->bits_per_raw_sample <= 8){ |
| 9552 | 908 decode_line(s, w, sample, plane_index, 8); |
| 909 for(x=0; x<w; x++){ | |
| 910 src[x + stride*y]= sample[1][x]; | |
| 911 } | |
| 9548 | 912 }else{ |
| 913 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample); | |
| 914 for(x=0; x<w; x++){ | |
| 915 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample); | |
| 916 } | |
| 917 } | |
| 1593 | 918 //STOP_TIMER("decode-line")} |
| 919 } | |
| 920 } | |
| 921 | |
| 922 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ | |
| 923 int x, y, p; | |
| 924 int_fast16_t sample_buffer[3][2][w+6]; | |
| 6847 | 925 int_fast16_t *sample[3][2]; |
| 926 for(x=0; x<3; x++){ | |
| 927 sample[x][0] = sample_buffer[x][0]+3; | |
| 928 sample[x][1] = sample_buffer[x][1]+3; | |
| 929 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
930 |
| 1593 | 931 s->run_index=0; |
| 2967 | 932 |
| 1593 | 933 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 934 |
| 1593 | 935 for(y=0; y<h; y++){ |
| 936 for(p=0; p<3; p++){ | |
| 937 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer | |
| 938 | |
| 939 sample[p][0]= sample[p][1]; | |
| 940 sample[p][1]= temp; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
941 |
| 1593 | 942 sample[p][1][-1]= sample[p][0][0 ]; |
| 943 sample[p][0][ w]= sample[p][0][w-1]; | |
| 944 decode_line(s, w, sample[p], FFMIN(p, 1), 9); | |
| 945 } | |
| 946 for(x=0; x<w; x++){ | |
| 947 int g= sample[0][1][x]; | |
| 948 int b= sample[1][1][x]; | |
| 949 int r= sample[2][1][x]; | |
| 1306 | 950 |
| 1593 | 951 // assert(g>=0 && b>=0 && r>=0); |
| 952 // assert(g<256 && b<512 && r<512); | |
| 2967 | 953 |
| 1593 | 954 b -= 0x100; |
| 955 r -= 0x100; | |
| 956 g -= (b + r)>>2; | |
| 957 b += g; | |
| 958 r += g; | |
| 2967 | 959 |
| 1593 | 960 src[x + stride*y]= b + (g<<8) + (r<<16); |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
961 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
962 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
963 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
964 |
| 2338 | 965 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
966 int v; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
967 int i=0; |
| 2338 | 968 uint8_t state[CONTEXT_SIZE]; |
| 969 | |
| 970 memset(state, 128, sizeof(state)); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
971 |
| 1306 | 972 for(v=0; i<128 ; v++){ |
| 2339 | 973 int len= get_symbol(c, state, 0) + 1; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
974 |
| 1306 | 975 if(len + i > 128) return -1; |
| 2967 | 976 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
977 while(len--){ |
| 1306 | 978 quant_table[i] = scale*v; |
| 979 i++; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
980 //printf("%2d ",v); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
981 //if(i%16==0) printf("\n"); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
982 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
983 } |
| 1306 | 984 |
| 985 for(i=1; i<128; i++){ | |
| 986 quant_table[256-i]= -quant_table[i]; | |
| 987 } | |
| 988 quant_table[128]= -quant_table[127]; | |
| 2967 | 989 |
| 1306 | 990 return 2*v - 1; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
991 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
992 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
993 static int read_header(FFV1Context *f){ |
| 2338 | 994 uint8_t state[CONTEXT_SIZE]; |
| 1306 | 995 int i, context_count; |
| 2338 | 996 RangeCoder * const c= &f->c; |
| 2967 | 997 |
| 2338 | 998 memset(state, 128, sizeof(state)); |
| 999 | |
| 2339 | 1000 f->version= get_symbol(c, state, 0); |
| 1001 f->ac= f->avctx->coder_type= get_symbol(c, state, 0); | |
| 11572 | 1002 if(f->ac>1){ |
| 1003 for(i=1; i<256; i++){ | |
| 1004 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i]; | |
| 1005 } | |
| 1006 } | |
| 2339 | 1007 f->colorspace= get_symbol(c, state, 0); //YUV cs type |
| 9548 | 1008 if(f->version>0) |
| 1009 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0); | |
| 2338 | 1010 get_rac(c, state); //no chroma = false |
| 2339 | 1011 f->chroma_h_shift= get_symbol(c, state, 0); |
| 1012 f->chroma_v_shift= get_symbol(c, state, 0); | |
| 2338 | 1013 get_rac(c, state); //transparency plane |
|
1345
daf951f32697
merge U and V statistics, 33% reduction in memory requirement, compression rate better for some files worse for others, worst compression rate loss 0.05%
michaelni
parents:
1337
diff
changeset
|
1014 f->plane_count= 2; |
|
1336
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1015 |
| 1593 | 1016 if(f->colorspace==0){ |
| 9548 | 1017 if(f->avctx->bits_per_raw_sample<=8){ |
| 9552 | 1018 switch(16*f->chroma_h_shift + f->chroma_v_shift){ |
| 1019 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break; | |
| 1020 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break; | |
| 1021 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break; | |
| 1022 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break; | |
| 1023 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break; | |
| 1024 default: | |
| 1025 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n"); | |
| 1026 return -1; | |
| 1027 } | |
| 9548 | 1028 }else{ |
| 1029 switch(16*f->chroma_h_shift + f->chroma_v_shift){ | |
| 1030 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break; | |
| 1031 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break; | |
| 1032 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break; | |
| 1033 default: | |
| 1034 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n"); | |
| 1035 return -1; | |
| 1036 } | |
| 1037 } | |
| 1593 | 1038 }else if(f->colorspace==1){ |
| 1039 if(f->chroma_h_shift || f->chroma_v_shift){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
1040 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n"); |
| 1593 | 1041 return -1; |
| 1042 } | |
|
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4283
diff
changeset
|
1043 f->avctx->pix_fmt= PIX_FMT_RGB32; |
| 1593 | 1044 }else{ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
1045 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n"); |
|
1336
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1046 return -1; |
|
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1047 } |
| 1593 | 1048 |
|
1336
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1049 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt); |
|
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1050 |
| 1306 | 1051 context_count=1; |
| 1052 for(i=0; i<5; i++){ | |
| 1053 context_count*= read_quant_table(c, f->quant_table[i], context_count); | |
| 2422 | 1054 if(context_count < 0 || context_count > 32768){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
1055 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n"); |
|
1336
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1056 return -1; |
|
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1057 } |
| 1306 | 1058 } |
| 1059 context_count= (context_count+1)/2; | |
| 2967 | 1060 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1061 for(i=0; i<f->plane_count; i++){ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1062 PlaneContext * const p= &f->plane[i]; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1063 |
| 1306 | 1064 p->context_count= context_count; |
| 1065 | |
| 1066 if(f->ac){ | |
| 1067 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); | |
| 1068 }else{ | |
| 1069 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); | |
| 1070 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1071 } |
| 2967 | 1072 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1073 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1074 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1075 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
1076 static av_cold int decode_init(AVCodecContext *avctx) |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1077 { |
| 1306 | 1078 // FFV1Context *s = avctx->priv_data; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1079 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1080 common_init(avctx); |
| 2967 | 1081 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1082 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1083 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1084 |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
1085 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){ |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
1086 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
8718
diff
changeset
|
1087 int buf_size = avpkt->size; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1088 FFV1Context *f = avctx->priv_data; |
| 2338 | 1089 RangeCoder * const c= &f->c; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1090 const int width= f->width; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1091 const int height= f->height; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1092 AVFrame * const p= &f->picture; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1093 int bytes_read; |
| 2338 | 1094 uint8_t keystate= 128; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1095 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1096 AVFrame *picture = data; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1097 |
| 2338 | 1098 ff_init_range_decoder(c, buf, buf_size); |
| 1099 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
|
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1786
diff
changeset
|
1100 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1101 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1102 p->pict_type= FF_I_TYPE; //FIXME I vs. P |
| 2338 | 1103 if(get_rac(c, &keystate)){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1104 p->key_frame= 1; |
| 3103 | 1105 if(read_header(f) < 0) |
| 1106 return -1; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1107 clear_state(f); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1108 }else{ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1109 p->key_frame= 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1110 } |
| 11572 | 1111 if(f->ac>1){ |
| 1112 int i; | |
| 1113 for(i=1; i<256; i++){ | |
| 1114 c->one_state[i]= f->state_transition[i]; | |
| 1115 c->zero_state[256-i]= 256-c->one_state[i]; | |
| 1116 } | |
| 1117 } | |
| 1118 | |
| 3103 | 1119 if(!f->plane[0].state && !f->plane[0].vlc_state) |
| 1120 return -1; | |
|
1336
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1121 |
|
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1122 p->reference= 0; |
|
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1123 if(avctx->get_buffer(avctx, p) < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
1124 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
|
1336
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1125 return -1; |
|
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1126 } |
|
c16ac5b7ac79
20% less memory needed for 8bit AC state (worst compression rate loss was 0.2%, all other files had <=0.1% loss)
michaelni
parents:
1325
diff
changeset
|
1127 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1128 if(avctx->debug&FF_DEBUG_PICT_INFO) |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
1129 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac); |
| 2967 | 1130 |
| 1306 | 1131 if(!f->ac){ |
| 2338 | 1132 bytes_read = c->bytestream - c->bytestream_start - 1; |
| 1133 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME | |
| 1306 | 1134 //printf("pos=%d\n", bytes_read); |
| 1135 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read); | |
| 1453 | 1136 } else { |
| 1137 bytes_read = 0; /* avoid warning */ | |
| 1306 | 1138 } |
| 2967 | 1139 |
| 1593 | 1140 if(f->colorspace==0){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1141 const int chroma_width = -((-width )>>f->chroma_h_shift); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1142 const int chroma_height= -((-height)>>f->chroma_v_shift); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1143 decode_plane(f, p->data[0], width, height, p->linesize[0], 0); |
| 2967 | 1144 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1145 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1); |
|
1345
daf951f32697
merge U and V statistics, 33% reduction in memory requirement, compression rate better for some files worse for others, worst compression rate loss 0.05%
michaelni
parents:
1337
diff
changeset
|
1146 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1); |
| 1593 | 1147 }else{ |
| 1148 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1149 } |
| 2967 | 1150 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1151 emms_c(); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1152 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1153 f->picture_number++; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1154 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1155 *picture= *p; |
| 2967 | 1156 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1157 avctx->release_buffer(avctx, p); //FIXME |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1158 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1159 *data_size = sizeof(AVFrame); |
| 2967 | 1160 |
| 1306 | 1161 if(f->ac){ |
| 2338 | 1162 bytes_read= c->bytestream - c->bytestream_start - 1; |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
1163 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n"); |
| 1306 | 1164 }else{ |
| 1165 bytes_read+= (get_bits_count(&f->gb)+7)/8; | |
| 1166 } | |
| 1167 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1168 return bytes_read; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1169 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1170 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1171 AVCodec ffv1_decoder = { |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1172 "ffv1", |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11530
diff
changeset
|
1173 AVMEDIA_TYPE_VIDEO, |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1174 CODEC_ID_FFV1, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1175 sizeof(FFV1Context), |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1176 decode_init, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1177 NULL, |
| 3283 | 1178 common_end, |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1179 decode_frame, |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
1180 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/, |
| 6713 | 1181 NULL, |
|
10121
3ae2df444cdb
Use "FFmpeg video codec #1" instead of "FFmpeg codec #1" as codec long name.
diego
parents:
10098
diff
changeset
|
1182 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"), |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1183 }; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1184 |
| 8590 | 1185 #if CONFIG_FFV1_ENCODER |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1186 AVCodec ffv1_encoder = { |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1187 "ffv1", |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11530
diff
changeset
|
1188 AVMEDIA_TYPE_VIDEO, |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1189 CODEC_ID_FFV1, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1190 sizeof(FFV1Context), |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1191 encode_init, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1192 encode_frame, |
| 3283 | 1193 common_end, |
|
10146
38cfe222e1a4
Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents:
10121
diff
changeset
|
1194 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_NONE}, |
|
10121
3ae2df444cdb
Use "FFmpeg video codec #1" instead of "FFmpeg codec #1" as codec long name.
diego
parents:
10098
diff
changeset
|
1195 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"), |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1196 }; |
| 1325 | 1197 #endif |
