Mercurial > libavcodec.hg
annotate ffv1.c @ 9120:dfd80d6fabfe libavcodec
cosmetics: indentation after last commit
| author | jbr |
|---|---|
| date | Wed, 04 Mar 2009 00:53:04 +0000 |
| parents | e9d9d946f213 |
| children | 54bc8a2727b0 |
| 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 /** |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8627
diff
changeset
|
24 * @file libavcodec/ffv1.c |
|
1545
b340e83b8d0d
gcc->C99 and warning fixes patch by (Dan Christiansen <danchr at daimi dot au dot dk>)
michael
parents:
1522
diff
changeset
|
25 * FF Video Codec 1 (an experimental 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" |
|
2398
582e635cfa08
common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents:
2339
diff
changeset
|
29 #include "bitstream.h" |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
30 #include "dsputil.h" |
| 2338 | 31 #include "rangecoder.h" |
| 1306 | 32 #include "golomb.h" |
|
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8590
diff
changeset
|
33 #include "mathops.h" |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
34 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
35 #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
|
36 #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
|
37 |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
38 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
|
39 |
| 1306 | 40 static const int8_t quant3[256]={ |
| 41 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 42 1, 1, 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, | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
47 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
|
48 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
| 1306 | 49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, |
| 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, 0, | |
| 57 }; | |
| 58 static const int8_t quant5[256]={ | |
| 59 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
|
60 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1306 | 61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 62 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 63 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 64 2, 2, 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,-2, | |
| 74 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1, | |
| 75 }; | |
| 76 static const int8_t quant7[256]={ | |
| 77 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 79 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 80 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 81 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 82 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 83 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 84 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 85 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 86 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 87 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 88 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 89 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 90 -3,-3,-3,-3,-3,-3,-3,-3,-3,-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,-1,-1, | |
| 93 }; | |
| 94 static const int8_t quant9[256]={ | |
| 95 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 96 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 97 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 98 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 99 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 100 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 101 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 102 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 103 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 104 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 105 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 106 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 107 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 108 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 109 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, | |
| 110 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, | |
| 111 }; | |
| 112 static const int8_t quant11[256]={ | |
| 113 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, | |
| 114 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 115 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 116 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 117 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 118 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 119 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 120 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 121 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 122 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 123 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 124 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 125 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 126 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-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,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, | |
| 129 }; | |
| 130 static const int8_t quant13[256]={ | |
| 131 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 132 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 133 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 134 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 135 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 136 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 137 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 138 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 139 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 140 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 141 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 142 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 143 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, | |
| 144 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 145 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 146 -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
|
147 }; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
148 |
| 1306 | 149 typedef struct VlcState{ |
| 150 int16_t drift; | |
| 151 uint16_t error_sum; | |
| 152 int8_t bias; | |
| 153 uint8_t count; | |
| 154 } VlcState; | |
| 155 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
156 typedef struct PlaneContext{ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
157 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
|
158 uint8_t (*state)[CONTEXT_SIZE]; |
| 1306 | 159 VlcState *vlc_state; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
160 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
|
161 } PlaneContext; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
162 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
163 typedef struct FFV1Context{ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
164 AVCodecContext *avctx; |
| 2338 | 165 RangeCoder c; |
| 1306 | 166 GetBitContext gb; |
| 167 PutBitContext pb; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
168 int version; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
169 int width, height; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
170 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
|
171 int flags; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
172 int picture_number; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
173 AVFrame picture; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
174 int plane_count; |
| 1306 | 175 int ac; ///< 1-> CABAC 0-> golomb rice |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
176 PlaneContext plane[MAX_PLANES]; |
| 1306 | 177 int16_t quant_table[5][256]; |
| 1593 | 178 int run_index; |
| 179 int colorspace; | |
| 2967 | 180 |
| 181 DSPContext dsp; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
182 }FFV1Context; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
183 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4001
diff
changeset
|
184 static av_always_inline int fold(int diff, int bits){ |
| 1593 | 185 if(bits==8) |
| 186 diff= (int8_t)diff; | |
| 187 else{ | |
| 188 diff+= 1<<(bits-1); | |
| 189 diff&=(1<<bits)-1; | |
| 190 diff-= 1<<(bits-1); | |
| 191 } | |
| 192 | |
| 193 return diff; | |
| 194 } | |
| 195 | |
| 196 static inline int predict(int_fast16_t *src, int_fast16_t *last){ | |
| 1306 | 197 const int LT= last[-1]; |
| 198 const int T= last[ 0]; | |
| 199 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
|
200 |
| 1360 | 201 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
|
202 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
203 |
| 1593 | 204 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){ |
| 1306 | 205 const int LT= last[-1]; |
| 206 const int T= last[ 0]; | |
| 207 const int RT= last[ 1]; | |
| 208 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
|
209 |
| 1306 | 210 if(f->quant_table[3][127]){ |
| 211 const int TT= last2[0]; | |
| 212 const int LL= src[-2]; | |
| 213 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF] | |
| 214 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF]; | |
| 215 }else | |
| 216 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
|
217 } |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
218 |
| 2339 | 219 static inline void put_symbol(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
|
220 int i; |
|
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 if(v){ |
| 4001 | 223 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
|
224 const int e= av_log2(a); |
| 2338 | 225 put_rac(c, state+0, 0); |
| 2967 | 226 |
| 2339 | 227 assert(e<=9); |
| 228 | |
|
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
|
229 for(i=0; i<e; i++){ |
| 2339 | 230 put_rac(c, state+1+i, 1); //1..10 |
| 231 } | |
| 232 put_rac(c, state+1+i, 0); | |
| 233 | |
| 234 for(i=e-1; i>=0; i--){ | |
| 235 put_rac(c, state+22+i, (a>>i)&1); //22..31 | |
|
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
|
236 } |
|
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
|
237 |
| 2339 | 238 if(is_signed) |
| 239 put_rac(c, state+11 + e, v < 0); //11..21 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
240 }else{ |
| 2338 | 241 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
|
242 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
243 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
244 |
| 2339 | 245 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ |
| 2338 | 246 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
|
247 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
248 else{ |
| 2339 | 249 int i, e, a; |
| 250 e= 0; | |
| 251 while(get_rac(c, state+1 + e)){ //1..10 | |
| 252 e++; | |
| 253 } | |
| 254 assert(e<=9); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
255 |
| 2339 | 256 a= 1; |
| 257 for(i=e-1; i>=0; i--){ | |
| 258 a += a + get_rac(c, state+22 + i); //22..31 | |
| 259 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
260 |
| 2339 | 261 if(is_signed && get_rac(c, state+11 + e)) //11..21 |
| 262 return -a; | |
| 263 else | |
| 264 return a; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
265 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
266 } |
| 1306 | 267 |
| 268 static inline void update_vlc_state(VlcState * const state, const int v){ | |
| 269 int drift= state->drift; | |
| 270 int count= state->count; | |
| 4001 | 271 state->error_sum += FFABS(v); |
| 1306 | 272 drift += v; |
| 273 | |
| 274 if(count == 128){ //FIXME variable | |
| 275 count >>= 1; | |
| 276 drift >>= 1; | |
| 277 state->error_sum >>= 1; | |
| 278 } | |
| 279 count++; | |
| 280 | |
| 281 if(drift <= -count){ | |
| 282 if(state->bias > -128) state->bias--; | |
| 2967 | 283 |
| 1306 | 284 drift += count; |
| 285 if(drift <= -count) | |
| 286 drift= -count + 1; | |
| 287 }else if(drift > 0){ | |
| 288 if(state->bias < 127) state->bias++; | |
| 2967 | 289 |
| 1306 | 290 drift -= count; |
| 2967 | 291 if(drift > 0) |
| 1306 | 292 drift= 0; |
| 293 } | |
| 294 | |
| 295 state->drift= drift; | |
| 296 state->count= count; | |
| 297 } | |
| 298 | |
| 1593 | 299 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){ |
| 1306 | 300 int i, k, code; |
| 301 //printf("final: %d ", v); | |
| 1593 | 302 v = fold(v - state->bias, bits); |
| 303 | |
| 1306 | 304 i= state->count; |
| 305 k=0; | |
| 306 while(i < state->error_sum){ //FIXME optimize | |
| 307 k++; | |
| 308 i += i; | |
| 309 } | |
|
1361
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
310 |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
311 assert(k<=8); |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
312 |
| 1306 | 313 #if 0 // JPEG LS |
| 314 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1); | |
| 315 else code= v; | |
| 316 #else | |
| 317 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
|
318 #endif |
| 2967 | 319 |
| 1306 | 320 //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 | 321 set_sr_golomb(pb, code, k, 12, bits); |
| 1306 | 322 |
| 323 update_vlc_state(state, v); | |
| 324 } | |
| 325 | |
| 1593 | 326 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){ |
| 1306 | 327 int k, i, v, ret; |
| 328 | |
| 329 i= state->count; | |
| 330 k=0; | |
| 331 while(i < state->error_sum){ //FIXME optimize | |
| 332 k++; | |
| 333 i += i; | |
| 334 } | |
|
1361
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
335 |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
336 assert(k<=8); |
|
8479b875a989
golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster)
michaelni
parents:
1360
diff
changeset
|
337 |
| 2220 | 338 v= get_sr_golomb(gb, k, 12, bits); |
| 1306 | 339 //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
|
340 |
| 1306 | 341 #if 0 // JPEG LS |
| 342 if(k==0 && 2*state->drift <= - state->count) v ^= (-1); | |
| 343 #else | |
| 344 v ^= ((2*state->drift + state->count)>>31); | |
| 345 #endif | |
| 346 | |
| 1593 | 347 ret= fold(v + state->bias, bits); |
| 2967 | 348 |
| 1306 | 349 update_vlc_state(state, v); |
| 350 //printf("final: %d\n", ret); | |
| 351 return ret; | |
| 352 } | |
| 353 | |
| 8590 | 354 #if CONFIG_FFV1_ENCODER |
| 2422 | 355 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
|
356 PlaneContext * const p= &s->plane[plane_index]; |
| 2338 | 357 RangeCoder * const c= &s->c; |
| 1593 | 358 int x; |
| 359 int run_index= s->run_index; | |
| 360 int run_count=0; | |
| 361 int run_mode=0; | |
| 362 | |
| 2422 | 363 if(s->ac){ |
| 364 if(c->bytestream_end - c->bytestream < w*20){ | |
| 365 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
| 366 return -1; | |
| 367 } | |
| 368 }else{ | |
| 369 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){ | |
| 370 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
| 371 return -1; | |
| 372 } | |
| 373 } | |
| 374 | |
| 1593 | 375 for(x=0; x<w; x++){ |
| 376 int diff, context; | |
| 2967 | 377 |
| 1999 | 378 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x); |
| 379 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x); | |
| 1593 | 380 |
| 381 if(context < 0){ | |
| 382 context = -context; | |
| 383 diff= -diff; | |
| 384 } | |
| 385 | |
| 386 diff= fold(diff, bits); | |
| 2967 | 387 |
| 1593 | 388 if(s->ac){ |
| 2339 | 389 put_symbol(c, p->state[context], diff, 1); |
| 1593 | 390 }else{ |
| 391 if(context == 0) run_mode=1; | |
| 2967 | 392 |
| 1593 | 393 if(run_mode){ |
| 394 | |
| 395 if(diff){ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
396 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
|
397 run_count -= 1<<ff_log2_run[run_index]; |
| 1593 | 398 run_index++; |
| 399 put_bits(&s->pb, 1, 1); | |
| 400 } | |
| 2967 | 401 |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
402 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count); |
| 1593 | 403 if(run_index) run_index--; |
| 404 run_count=0; | |
| 405 run_mode=0; | |
| 406 if(diff>0) diff--; | |
| 407 }else{ | |
| 408 run_count++; | |
| 409 } | |
| 410 } | |
| 2967 | 411 |
| 1786 | 412 // 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 | 413 |
| 414 if(run_mode == 0) | |
| 415 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits); | |
| 416 } | |
| 417 } | |
| 418 if(run_mode){ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
419 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
|
420 run_count -= 1<<ff_log2_run[run_index]; |
| 1593 | 421 run_index++; |
| 422 put_bits(&s->pb, 1, 1); | |
| 423 } | |
| 424 | |
| 425 if(run_count) | |
| 426 put_bits(&s->pb, 1, 1); | |
| 427 } | |
| 428 s->run_index= run_index; | |
| 2967 | 429 |
| 2422 | 430 return 0; |
| 1593 | 431 } |
| 432 | |
| 433 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | |
| 1999 | 434 int x,y,i; |
| 2162 | 435 const int ring_size= s->avctx->context_model ? 3 : 2; |
| 1999 | 436 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size]; |
| 1593 | 437 s->run_index=0; |
| 2967 | 438 |
| 1337 | 439 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 440 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
441 for(y=0; y<h; y++){ |
| 1999 | 442 for(i=0; i<ring_size; i++) |
| 443 sample[i]= sample_buffer[(h+i-y)%ring_size]+3; | |
| 2967 | 444 |
| 1999 | 445 sample[0][-1]= sample[1][0 ]; |
| 446 sample[1][ w]= sample[1][w-1]; | |
| 1593 | 447 //{START_TIMER |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
448 for(x=0; x<w; x++){ |
| 1999 | 449 sample[0][x]= src[x + stride*y]; |
| 1593 | 450 } |
| 451 encode_line(s, w, sample, plane_index, 8); | |
| 452 //STOP_TIMER("encode line")} | |
| 453 } | |
| 454 } | |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
455 |
| 1593 | 456 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ |
| 1999 | 457 int x, y, p, i; |
| 2162 | 458 const int ring_size= s->avctx->context_model ? 3 : 2; |
| 1999 | 459 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size]; |
| 1593 | 460 s->run_index=0; |
| 2967 | 461 |
| 1593 | 462 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 463 |
| 1593 | 464 for(y=0; y<h; y++){ |
| 1999 | 465 for(i=0; i<ring_size; i++) |
| 466 for(p=0; p<3; p++) | |
| 467 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3; | |
| 468 | |
| 1593 | 469 for(x=0; x<w; x++){ |
| 470 int v= src[x + stride*y]; | |
| 471 int b= v&0xFF; | |
| 472 int g= (v>>8)&0xFF; | |
| 473 int r= (v>>16)&0xFF; | |
| 2967 | 474 |
| 1593 | 475 b -= g; |
| 476 r -= g; | |
| 477 g += (b + r)>>2; | |
| 478 b += 0x100; | |
| 479 r += 0x100; | |
| 2967 | 480 |
| 1593 | 481 // assert(g>=0 && b>=0 && r>=0); |
| 482 // assert(g<256 && b<512 && r<512); | |
| 483 sample[0][0][x]= g; | |
| 484 sample[1][0][x]= b; | |
| 485 sample[2][0][x]= r; | |
| 486 } | |
| 487 for(p=0; p<3; p++){ | |
| 1999 | 488 sample[p][0][-1]= sample[p][1][0 ]; |
| 489 sample[p][1][ w]= sample[p][1][w-1]; | |
| 1593 | 490 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
|
491 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
492 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
493 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
494 |
| 2338 | 495 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
|
496 int last=0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
497 int i; |
| 2338 | 498 uint8_t state[CONTEXT_SIZE]; |
| 499 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
|
500 |
| 1306 | 501 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
|
502 if(quant_table[i] != quant_table[i-1]){ |
| 2339 | 503 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
|
504 last= i; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
505 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
506 } |
| 2339 | 507 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
|
508 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
509 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
510 static void write_header(FFV1Context *f){ |
| 2338 | 511 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
|
512 int i; |
| 2338 | 513 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
|
514 |
| 2338 | 515 memset(state, 128, sizeof(state)); |
| 2967 | 516 |
| 2339 | 517 put_symbol(c, state, f->version, 0); |
| 518 put_symbol(c, state, f->avctx->coder_type, 0); | |
| 2967 | 519 put_symbol(c, state, f->colorspace, 0); //YUV cs type |
| 2338 | 520 put_rac(c, state, 1); //chroma planes |
| 2339 | 521 put_symbol(c, state, f->chroma_h_shift, 0); |
| 522 put_symbol(c, state, f->chroma_v_shift, 0); | |
| 2338 | 523 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
|
524 |
| 1306 | 525 for(i=0; i<5; i++) |
| 526 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
|
527 } |
|
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7146
diff
changeset
|
528 #endif /* CONFIG_FFV1_ENCODER */ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
529 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
530 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
|
531 FFV1Context *s = avctx->priv_data; |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
532 int width, height; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
533 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
534 s->avctx= avctx; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
535 s->flags= avctx->flags; |
| 2967 | 536 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
537 dsputil_init(&s->dsp, avctx); |
| 2967 | 538 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
539 width= s->width= avctx->width; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
540 height= s->height= avctx->height; |
| 2967 | 541 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
542 assert(width && height); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
543 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
544 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
545 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
546 |
| 8590 | 547 #if CONFIG_FFV1_ENCODER |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
548 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
|
549 { |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
550 FFV1Context *s = avctx->priv_data; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
551 int i; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
552 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
553 common_init(avctx); |
| 2967 | 554 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
555 s->version=0; |
| 1306 | 556 s->ac= avctx->coder_type; |
| 2967 | 557 |
|
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
|
558 s->plane_count=2; |
| 1306 | 559 for(i=0; i<256; i++){ |
| 560 s->quant_table[0][i]= quant11[i]; | |
| 561 s->quant_table[1][i]= 11*quant11[i]; | |
| 562 if(avctx->context_model==0){ | |
| 563 s->quant_table[2][i]= 11*11*quant11[i]; | |
| 564 s->quant_table[3][i]= | |
| 565 s->quant_table[4][i]=0; | |
| 566 }else{ | |
| 567 s->quant_table[2][i]= 11*11*quant5 [i]; | |
| 568 s->quant_table[3][i]= 5*11*11*quant5 [i]; | |
| 569 s->quant_table[4][i]= 5*5*11*11*quant5 [i]; | |
| 570 } | |
| 571 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
572 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
573 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
|
574 PlaneContext * const p= &s->plane[i]; |
| 2967 | 575 |
| 1306 | 576 if(avctx->context_model==0){ |
| 577 p->context_count= (11*11*11+1)/2; | |
| 2967 | 578 }else{ |
| 1306 | 579 p->context_count= (11*11*5*5*5+1)/2; |
| 580 } | |
| 581 | |
| 582 if(s->ac){ | |
| 583 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); | |
| 584 }else{ | |
| 585 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); | |
| 586 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
587 } |
|
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 avctx->coded_frame= &s->picture; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
590 switch(avctx->pix_fmt){ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
591 case PIX_FMT_YUV444P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
592 case PIX_FMT_YUV422P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
593 case PIX_FMT_YUV420P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
594 case PIX_FMT_YUV411P: |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
595 case PIX_FMT_YUV410P: |
| 1593 | 596 s->colorspace= 0; |
| 597 break; | |
|
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4283
diff
changeset
|
598 case PIX_FMT_RGB32: |
| 1593 | 599 s->colorspace= 1; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
600 break; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
601 default: |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
602 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
|
603 return -1; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
604 } |
| 1593 | 605 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); |
| 606 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
607 s->picture_number=0; |
| 2967 | 608 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
609 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
610 } |
|
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7146
diff
changeset
|
611 #endif /* CONFIG_FFV1_ENCODER */ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
612 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
613 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
614 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
|
615 int i, j; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
616 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
617 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
|
618 PlaneContext *p= &f->plane[i]; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
619 |
| 2338 | 620 p->interlace_bit_state[0]= 128; |
| 621 p->interlace_bit_state[1]= 128; | |
| 2967 | 622 |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
623 for(j=0; j<p->context_count; j++){ |
| 1306 | 624 if(f->ac){ |
| 2338 | 625 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE); |
| 1306 | 626 }else{ |
| 627 p->vlc_state[j].drift= 0; | |
| 628 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2); | |
| 629 p->vlc_state[j].bias= 0; | |
| 630 p->vlc_state[j].count= 1; | |
| 631 } | |
|
1302
c41f51b5d5d6
reducing memory consumption (reducing number of contexts and other stuff, no noticeable loss in compression rate)
michaelni
parents:
1300
diff
changeset
|
632 } |
|
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 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
635 |
| 8590 | 636 #if CONFIG_FFV1_ENCODER |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
637 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
|
638 FFV1Context *f = avctx->priv_data; |
| 2338 | 639 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
|
640 AVFrame *pict = data; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
641 const int width= f->width; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
642 const int height= f->height; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
643 AVFrame * const p= &f->picture; |
| 1306 | 644 int used_count= 0; |
| 2338 | 645 uint8_t keystate=128; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
646 |
| 2338 | 647 ff_init_range_encoder(c, buf, buf_size); |
| 648 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); | |
| 649 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
| 650 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
651 *p = *pict; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
652 p->pict_type= FF_I_TYPE; |
| 2967 | 653 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
654 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){ |
| 2338 | 655 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
|
656 p->key_frame= 1; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
657 write_header(f); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
658 clear_state(f); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
659 }else{ |
| 2338 | 660 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
|
661 p->key_frame= 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
662 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
663 |
| 1306 | 664 if(!f->ac){ |
| 2338 | 665 used_count += ff_rac_terminate(c); |
| 1306 | 666 //printf("pos=%d\n", used_count); |
|
1522
79dddc5cd990
removed the obsolete and unused parameters of init_put_bits
alex
parents:
1453
diff
changeset
|
667 init_put_bits(&f->pb, buf + used_count, buf_size - used_count); |
| 1306 | 668 } |
| 2967 | 669 |
| 1593 | 670 if(f->colorspace==0){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
671 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
|
672 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
|
673 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
674 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
|
675 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
676 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
|
677 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1); |
| 1593 | 678 }else{ |
| 679 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
|
680 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
681 emms_c(); |
| 2967 | 682 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
683 f->picture_number++; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
684 |
| 1306 | 685 if(f->ac){ |
| 2338 | 686 return ff_rac_terminate(c); |
| 1306 | 687 }else{ |
| 688 flush_put_bits(&f->pb); //nicer padding FIXME | |
| 1786 | 689 return used_count + (put_bits_count(&f->pb)+7)/8; |
| 1306 | 690 } |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
691 } |
|
7782
6efb15a24e91
Replace generic CONFIG_ENCODERS preprocessor conditionals by more specific
diego
parents:
7146
diff
changeset
|
692 #endif /* CONFIG_FFV1_ENCODER */ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
693 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
694 static av_cold int common_end(AVCodecContext *avctx){ |
| 3283 | 695 FFV1Context *s = avctx->priv_data; |
| 2967 | 696 int i; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
697 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
698 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
|
699 PlaneContext *p= &s->plane[i]; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
700 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
701 av_freep(&p->state); |
| 5222 | 702 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
|
703 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
704 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
705 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
706 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
707 |
| 1605 | 708 static 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
|
709 PlaneContext * const p= &s->plane[plane_index]; |
| 2338 | 710 RangeCoder * const c= &s->c; |
| 1593 | 711 int x; |
| 712 int run_count=0; | |
| 713 int run_mode=0; | |
| 714 int run_index= s->run_index; | |
| 715 | |
| 716 for(x=0; x<w; x++){ | |
| 717 int diff, context, sign; | |
| 2967 | 718 |
| 1593 | 719 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x); |
| 720 if(context < 0){ | |
| 721 context= -context; | |
| 722 sign=1; | |
| 723 }else | |
| 724 sign=0; | |
| 2967 | 725 |
| 1593 | 726 |
| 2339 | 727 if(s->ac){ |
| 728 diff= get_symbol(c, p->state[context], 1); | |
| 729 }else{ | |
| 1593 | 730 if(context == 0 && run_mode==0) run_mode=1; |
| 2967 | 731 |
| 1593 | 732 if(run_mode){ |
| 733 if(run_count==0 && run_mode==1){ | |
| 734 if(get_bits1(&s->gb)){ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
735 run_count = 1<<ff_log2_run[run_index]; |
| 1593 | 736 if(x + run_count <= w) run_index++; |
| 737 }else{ | |
|
7146
d3a1ac3e227b
move ff_log2_run to bitstream.c and reuse in ffv1.c
stefang
parents:
7040
diff
changeset
|
738 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]); |
| 1593 | 739 else run_count=0; |
| 740 if(run_index) run_index--; | |
| 741 run_mode=2; | |
| 742 } | |
| 743 } | |
| 744 run_count--; | |
| 745 if(run_count < 0){ | |
| 746 run_mode=0; | |
| 747 run_count=0; | |
| 748 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits); | |
| 749 if(diff>=0) diff++; | |
| 750 }else | |
| 751 diff=0; | |
| 752 }else | |
| 753 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits); | |
| 2967 | 754 |
| 1593 | 755 // 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)); |
| 756 } | |
| 757 | |
| 758 if(sign) diff= -diff; | |
| 759 | |
| 760 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1); | |
| 761 } | |
| 2967 | 762 s->run_index= run_index; |
| 1593 | 763 } |
| 764 | |
| 765 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | |
| 766 int x, y; | |
| 767 int_fast16_t sample_buffer[2][w+6]; | |
| 6847 | 768 int_fast16_t *sample[2]; |
| 769 sample[0]=sample_buffer[0]+3; | |
| 770 sample[1]=sample_buffer[1]+3; | |
| 1593 | 771 |
| 772 s->run_index=0; | |
| 2967 | 773 |
| 1337 | 774 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 775 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
776 for(y=0; y<h; y++){ |
| 1593 | 777 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
|
778 |
| 1337 | 779 sample[0]= sample[1]; |
| 780 sample[1]= temp; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
781 |
| 1337 | 782 sample[1][-1]= sample[0][0 ]; |
| 783 sample[0][ w]= sample[0][w-1]; | |
| 2967 | 784 |
| 1593 | 785 //{START_TIMER |
| 786 decode_line(s, w, sample, plane_index, 8); | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
787 for(x=0; x<w; x++){ |
| 1593 | 788 src[x + stride*y]= sample[1][x]; |
| 789 } | |
| 790 //STOP_TIMER("decode-line")} | |
| 791 } | |
| 792 } | |
| 793 | |
| 794 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ | |
| 795 int x, y, p; | |
| 796 int_fast16_t sample_buffer[3][2][w+6]; | |
| 6847 | 797 int_fast16_t *sample[3][2]; |
| 798 for(x=0; x<3; x++){ | |
| 799 sample[x][0] = sample_buffer[x][0]+3; | |
| 800 sample[x][1] = sample_buffer[x][1]+3; | |
| 801 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
802 |
| 1593 | 803 s->run_index=0; |
| 2967 | 804 |
| 1593 | 805 memset(sample_buffer, 0, sizeof(sample_buffer)); |
| 2967 | 806 |
| 1593 | 807 for(y=0; y<h; y++){ |
| 808 for(p=0; p<3; p++){ | |
| 809 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer | |
| 810 | |
| 811 sample[p][0]= sample[p][1]; | |
| 812 sample[p][1]= temp; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
813 |
| 1593 | 814 sample[p][1][-1]= sample[p][0][0 ]; |
| 815 sample[p][0][ w]= sample[p][0][w-1]; | |
| 816 decode_line(s, w, sample[p], FFMIN(p, 1), 9); | |
| 817 } | |
| 818 for(x=0; x<w; x++){ | |
| 819 int g= sample[0][1][x]; | |
| 820 int b= sample[1][1][x]; | |
| 821 int r= sample[2][1][x]; | |
| 1306 | 822 |
| 1593 | 823 // assert(g>=0 && b>=0 && r>=0); |
| 824 // assert(g<256 && b<512 && r<512); | |
| 2967 | 825 |
| 1593 | 826 b -= 0x100; |
| 827 r -= 0x100; | |
| 828 g -= (b + r)>>2; | |
| 829 b += g; | |
| 830 r += g; | |
| 2967 | 831 |
| 1593 | 832 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
|
833 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
834 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
835 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
836 |
| 2338 | 837 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
|
838 int v; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
839 int i=0; |
| 2338 | 840 uint8_t state[CONTEXT_SIZE]; |
| 841 | |
| 842 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
|
843 |
| 1306 | 844 for(v=0; i<128 ; v++){ |
| 2339 | 845 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
|
846 |
| 1306 | 847 if(len + i > 128) return -1; |
| 2967 | 848 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
849 while(len--){ |
| 1306 | 850 quant_table[i] = scale*v; |
| 851 i++; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
852 //printf("%2d ",v); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
853 //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
|
854 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
855 } |
| 1306 | 856 |
| 857 for(i=1; i<128; i++){ | |
| 858 quant_table[256-i]= -quant_table[i]; | |
| 859 } | |
| 860 quant_table[128]= -quant_table[127]; | |
| 2967 | 861 |
| 1306 | 862 return 2*v - 1; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
863 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
864 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
865 static int read_header(FFV1Context *f){ |
| 2338 | 866 uint8_t state[CONTEXT_SIZE]; |
| 1306 | 867 int i, context_count; |
| 2338 | 868 RangeCoder * const c= &f->c; |
| 2967 | 869 |
| 2338 | 870 memset(state, 128, sizeof(state)); |
| 871 | |
| 2339 | 872 f->version= get_symbol(c, state, 0); |
| 873 f->ac= f->avctx->coder_type= get_symbol(c, state, 0); | |
| 874 f->colorspace= get_symbol(c, state, 0); //YUV cs type | |
| 2338 | 875 get_rac(c, state); //no chroma = false |
| 2339 | 876 f->chroma_h_shift= get_symbol(c, state, 0); |
| 877 f->chroma_v_shift= get_symbol(c, state, 0); | |
| 2338 | 878 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
|
879 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
|
880 |
| 1593 | 881 if(f->colorspace==0){ |
| 882 switch(16*f->chroma_h_shift + f->chroma_v_shift){ | |
| 883 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break; | |
| 884 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break; | |
| 885 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break; | |
| 886 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break; | |
|
2512
a7779d61c8ce
Fixed decoding of 410p ffv1 files patch by (Milan Cutka <cutka szm sk>)
michael
parents:
2453
diff
changeset
|
887 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break; |
| 1593 | 888 default: |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
889 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n"); |
| 1593 | 890 return -1; |
| 891 } | |
| 892 }else if(f->colorspace==1){ | |
| 893 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
|
894 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n"); |
| 1593 | 895 return -1; |
| 896 } | |
|
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4283
diff
changeset
|
897 f->avctx->pix_fmt= PIX_FMT_RGB32; |
| 1593 | 898 }else{ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1593
diff
changeset
|
899 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
|
900 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
|
901 } |
| 1593 | 902 |
|
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
|
903 //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
|
904 |
| 1306 | 905 context_count=1; |
| 906 for(i=0; i<5; i++){ | |
| 907 context_count*= read_quant_table(c, f->quant_table[i], context_count); | |
| 2422 | 908 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
|
909 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
|
910 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
|
911 } |
| 1306 | 912 } |
| 913 context_count= (context_count+1)/2; | |
| 2967 | 914 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
915 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
|
916 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
|
917 |
| 1306 | 918 p->context_count= context_count; |
| 919 | |
| 920 if(f->ac){ | |
| 921 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); | |
| 922 }else{ | |
| 923 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); | |
| 924 } | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
925 } |
| 2967 | 926 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
927 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
928 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
929 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6234
diff
changeset
|
930 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
|
931 { |
| 1306 | 932 // 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
|
933 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
934 common_init(avctx); |
| 2967 | 935 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
936 return 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
937 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
938 |
| 6234 | 939 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
940 FFV1Context *f = avctx->priv_data; |
| 2338 | 941 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
|
942 const int width= f->width; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
943 const int height= f->height; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
944 AVFrame * const p= &f->picture; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
945 int bytes_read; |
| 2338 | 946 uint8_t keystate= 128; |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
947 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
948 AVFrame *picture = data; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
949 |
| 2338 | 950 ff_init_range_decoder(c, buf, buf_size); |
| 951 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
|
952 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
953 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
954 p->pict_type= FF_I_TYPE; //FIXME I vs. P |
| 2338 | 955 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
|
956 p->key_frame= 1; |
| 3103 | 957 if(read_header(f) < 0) |
| 958 return -1; | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
959 clear_state(f); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
960 }else{ |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
961 p->key_frame= 0; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
962 } |
| 3103 | 963 if(!f->plane[0].state && !f->plane[0].vlc_state) |
| 964 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
|
965 |
|
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
|
966 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
|
967 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
|
968 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
|
969 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
|
970 } |
|
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
|
971 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
972 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
|
973 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac); |
| 2967 | 974 |
| 1306 | 975 if(!f->ac){ |
| 2338 | 976 bytes_read = c->bytestream - c->bytestream_start - 1; |
| 977 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME | |
| 1306 | 978 //printf("pos=%d\n", bytes_read); |
| 979 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read); | |
| 1453 | 980 } else { |
| 981 bytes_read = 0; /* avoid warning */ | |
| 1306 | 982 } |
| 2967 | 983 |
| 1593 | 984 if(f->colorspace==0){ |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
985 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
|
986 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
|
987 decode_plane(f, p->data[0], width, height, p->linesize[0], 0); |
| 2967 | 988 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
989 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
|
990 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1); |
| 1593 | 991 }else{ |
| 992 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
|
993 } |
| 2967 | 994 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
995 emms_c(); |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
996 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
997 f->picture_number++; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
998 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
999 *picture= *p; |
| 2967 | 1000 |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1001 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
|
1002 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1003 *data_size = sizeof(AVFrame); |
| 2967 | 1004 |
| 1306 | 1005 if(f->ac){ |
| 2338 | 1006 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
|
1007 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n"); |
| 1306 | 1008 }else{ |
| 1009 bytes_read+= (get_bits_count(&f->gb)+7)/8; | |
| 1010 } | |
| 1011 | |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1012 return bytes_read; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1013 } |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1014 |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1015 AVCodec ffv1_decoder = { |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1016 "ffv1", |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1017 CODEC_TYPE_VIDEO, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1018 CODEC_ID_FFV1, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1019 sizeof(FFV1Context), |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1020 decode_init, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1021 NULL, |
| 3283 | 1022 common_end, |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1023 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
|
1024 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/, |
| 6713 | 1025 NULL, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6847
diff
changeset
|
1026 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"), |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1027 }; |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1028 |
| 8590 | 1029 #if CONFIG_FFV1_ENCODER |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1030 AVCodec ffv1_encoder = { |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1031 "ffv1", |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1032 CODEC_TYPE_VIDEO, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1033 CODEC_ID_FFV1, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1034 sizeof(FFV1Context), |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1035 encode_init, |
|
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1036 encode_frame, |
| 3283 | 1037 common_end, |
| 6788 | 1038 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, PIX_FMT_NONE}, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6847
diff
changeset
|
1039 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"), |
|
1300
e18667d1e94d
FFV1 codec (our very simple lossless intra only codec, compresses much better then huffyuv)
michaelni
parents:
diff
changeset
|
1040 }; |
| 1325 | 1041 #endif |
