Mercurial > libavcodec.hg
annotate snow.c @ 4331:e571dfe677be libavcodec
store a few values in the header as difference to the last
this makes frames a few bytes smaller (0.1% for high bitrate but >1% for low bitrates)
| author | michael |
|---|---|
| date | Tue, 02 Jan 2007 12:24:31 +0000 |
| parents | d6f83e2f8804 |
| children | 35812973e0bc |
| rev | line source |
|---|---|
| 2138 | 1 /* |
| 2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> | |
| 3 * | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
4 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
5 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
| 2138 | 7 * modify it under the terms of the GNU Lesser General Public |
| 8 * 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:
3920
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
| 2138 | 10 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3920
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
| 2138 | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 * Lesser General Public License for more details. | |
| 15 * | |
| 16 * 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:
3920
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3035
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 2138 | 19 */ |
| 20 | |
| 21 #include "avcodec.h" | |
| 22 #include "common.h" | |
| 23 #include "dsputil.h" | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
24 #include "snow.h" |
| 2335 | 25 |
| 26 #include "rangecoder.h" | |
| 2138 | 27 |
| 28 #include "mpegvideo.h" | |
| 29 | |
| 30 #undef NDEBUG | |
| 31 #include <assert.h> | |
| 32 | |
| 33 static const int8_t quant3[256]={ | |
| 34 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 35 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 36 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 41 1, 1, 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, | |
| 47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, | |
| 50 }; | |
| 51 static const int8_t quant3b[256]={ | |
| 52 0, 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, 1, | |
| 58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 59 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
| 60 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-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,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 65 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 66 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 67 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |
| 68 }; | |
| 2596 | 69 static const int8_t quant3bA[256]={ |
| 70 0, 0, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 71 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 72 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 73 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-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, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 77 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 78 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 79 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 80 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 81 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 82 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 83 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 84 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 85 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, | |
| 86 }; | |
| 2138 | 87 static const int8_t quant5[256]={ |
| 88 0, 1, 1, 1, 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, 2, 2, 2, | |
| 96 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 97 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 98 -2,-2,-2,-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,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 101 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 102 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 103 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1, | |
| 104 }; | |
| 105 static const int8_t quant7[256]={ | |
| 106 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 107 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
| 108 2, 2, 2, 2, 2, 2, 2, 2, 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, 3, 3, 3, 3, 3, 3, 3, | |
| 112 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 113 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 114 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 115 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 116 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 117 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 118 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, | |
| 119 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2, | |
| 120 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, | |
| 121 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1, | |
| 122 }; | |
| 123 static const int8_t quant9[256]={ | |
| 124 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
| 125 3, 3, 3, 3, 3, 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, 4, 4, 4, 4, | |
| 131 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 132 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 133 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 134 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 135 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 136 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 137 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 138 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, | |
| 139 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, | |
| 140 }; | |
| 141 static const int8_t quant11[256]={ | |
| 142 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 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, 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 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 147 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 148 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 149 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | |
| 150 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 151 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 152 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 153 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 154 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 155 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4, | |
| 156 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, | |
| 157 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, | |
| 158 }; | |
| 159 static const int8_t quant13[256]={ | |
| 160 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, | |
| 161 4, 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, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 164 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 165 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 166 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 167 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | |
| 168 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 169 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 170 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 171 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, | |
| 172 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, | |
| 173 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 174 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, | |
| 175 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1, | |
| 176 }; | |
| 177 | |
| 178 #if 0 //64*cubic | |
| 179 static const uint8_t obmc32[1024]={ | |
| 180 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 181 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
| 182 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
| 183 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, | |
| 184 0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0, | |
| 185 0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0, | |
| 186 0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0, | |
| 187 0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0, | |
| 188 0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0, | |
| 189 0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0, | |
| 190 0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0, | |
| 191 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0, | |
| 192 0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0, | |
| 193 0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0, | |
| 194 0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0, | |
| 195 0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0, | |
| 196 0, 2, 4, 8,12,18,23,29,35,41,46,52,56,60,62,64,64,62,60,56,52,46,41,35,29,23,18,12, 8, 4, 2, 0, | |
| 197 0, 1, 4, 8,12,17,22,28,34,40,45,51,55,58,61,62,62,61,58,55,51,45,40,34,28,22,17,12, 8, 4, 1, 0, | |
| 198 0, 2, 4, 7,12,16,22,27,33,38,44,48,52,56,58,60,60,58,56,52,48,44,38,33,27,22,16,12, 7, 4, 2, 0, | |
| 199 0, 1, 4, 7,11,15,20,25,31,36,41,45,49,52,55,56,56,55,52,49,45,41,36,31,25,20,15,11, 7, 4, 1, 0, | |
| 200 0, 1, 3, 6,10,14,19,23,28,33,38,42,45,48,51,52,52,51,48,45,42,38,33,28,23,19,14,10, 6, 3, 1, 0, | |
| 201 0, 1, 3, 6, 9,12,17,21,25,30,34,38,41,44,45,46,46,45,44,41,38,34,30,25,21,17,12, 9, 6, 3, 1, 0, | |
| 202 0, 1, 3, 5, 8,11,15,19,22,26,30,33,36,38,40,41,41,40,38,36,33,30,26,22,19,15,11, 8, 5, 3, 1, 0, | |
| 203 0, 1, 2, 4, 7,10,13,16,19,22,25,28,31,33,34,35,35,34,33,31,28,25,22,19,16,13,10, 7, 4, 2, 1, 0, | |
| 204 0, 1, 2, 4, 6, 8,10,13,16,19,21,23,25,27,28,29,29,28,27,25,23,21,19,16,13,10, 8, 6, 4, 2, 1, 0, | |
| 205 0, 1, 1, 3, 4, 6, 8,10,13,15,17,19,20,22,22,23,23,22,22,20,19,17,15,13,10, 8, 6, 4, 3, 1, 1, 0, | |
| 206 0, 1, 1, 2, 3, 5, 6, 8,10,11,13,14,15,16,17,18,18,17,16,15,14,13,11,10, 8, 6, 5, 3, 2, 1, 1, 0, | |
| 207 0, 0, 1, 2, 2, 3, 4, 6, 7, 8, 9,10,11,12,12,12,12,12,12,11,10, 9, 8, 7, 6, 4, 3, 2, 2, 1, 0, 0, | |
| 208 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, | |
| 209 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
| 210 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
| 211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 212 //error:0.000022 | |
| 213 }; | |
| 214 static const uint8_t obmc16[256]={ | |
| 215 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
| 216 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0, | |
| 217 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0, | |
| 218 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0, | |
| 219 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0, | |
| 220 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0, | |
| 221 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1, | |
| 222 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1, | |
| 223 1, 6,15,26,38,49,57,62,62,57,49,38,26,15, 6, 1, | |
| 224 1, 5,13,24,34,45,53,57,57,53,45,34,24,13, 5, 1, | |
| 225 0, 5,11,20,29,38,45,49,49,45,38,29,20,11, 5, 0, | |
| 226 0, 4, 9,15,23,29,34,38,38,34,29,23,15, 9, 4, 0, | |
| 227 0, 2, 6,11,15,20,24,26,26,24,20,15,11, 6, 2, 0, | |
| 228 0, 1, 4, 6, 9,11,13,15,15,13,11, 9, 6, 4, 1, 0, | |
| 229 0, 1, 1, 2, 4, 5, 5, 6, 6, 5, 5, 4, 2, 1, 1, 0, | |
| 230 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
| 231 //error:0.000033 | |
| 232 }; | |
| 233 #elif 1 // 64*linear | |
| 234 static const uint8_t obmc32[1024]={ | |
| 3206 | 235 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, |
| 236 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0, | |
| 237 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0, | |
| 238 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0, | |
| 239 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4, | |
| 240 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4, | |
| 241 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4, | |
| 242 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4, | |
| 243 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4, | |
| 244 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4, | |
| 245 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4, | |
| 246 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4, | |
| 247 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8, | |
| 248 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8, | |
| 249 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8, | |
| 250 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8, | |
| 251 8, 24, 40, 56, 68, 84,100,116,132,148,164,180,192,208,224,240,240,224,208,192,180,164,148,132,116,100, 84, 68, 56, 40, 24, 8, | |
| 252 8, 20, 36, 52, 64, 80, 96,108,124,136,152,168,180,196,212,224,224,212,196,180,168,152,136,124,108, 96, 80, 64, 52, 36, 20, 8, | |
| 253 8, 20, 32, 48, 60, 76, 88,100,116,128,140,156,168,184,196,208,208,196,184,168,156,140,128,116,100, 88, 76, 60, 48, 32, 20, 8, | |
| 254 8, 20, 32, 44, 56, 68, 80, 92,108,120,132,144,156,168,180,192,192,180,168,156,144,132,120,108, 92, 80, 68, 56, 44, 32, 20, 8, | |
| 255 4, 16, 28, 40, 52, 64, 76, 88, 96,108,120,132,144,156,168,180,180,168,156,144,132,120,108, 96, 88, 76, 64, 52, 40, 28, 16, 4, | |
| 256 4, 16, 28, 36, 48, 56, 68, 80, 88,100,112,120,132,140,152,164,164,152,140,132,120,112,100, 88, 80, 68, 56, 48, 36, 28, 16, 4, | |
| 257 4, 16, 24, 32, 44, 52, 60, 72, 80, 92,100,108,120,128,136,148,148,136,128,120,108,100, 92, 80, 72, 60, 52, 44, 32, 24, 16, 4, | |
| 258 4, 12, 20, 28, 40, 48, 56, 64, 72, 80, 88, 96,108,116,124,132,132,124,116,108, 96, 88, 80, 72, 64, 56, 48, 40, 28, 20, 12, 4, | |
| 259 4, 12, 20, 28, 32, 40, 48, 56, 64, 72, 80, 88, 92,100,108,116,116,108,100, 92, 88, 80, 72, 64, 56, 48, 40, 32, 28, 20, 12, 4, | |
| 260 4, 8, 16, 24, 28, 36, 44, 48, 56, 60, 68, 76, 80, 88, 96,100,100, 96, 88, 80, 76, 68, 60, 56, 48, 44, 36, 28, 24, 16, 8, 4, | |
| 261 4, 8, 12, 20, 24, 32, 36, 40, 48, 52, 56, 64, 68, 76, 80, 84, 84, 80, 76, 68, 64, 56, 52, 48, 40, 36, 32, 24, 20, 12, 8, 4, | |
| 262 4, 8, 12, 16, 20, 24, 28, 32, 40, 44, 48, 52, 56, 60, 64, 68, 68, 64, 60, 56, 52, 48, 44, 40, 32, 28, 24, 20, 16, 12, 8, 4, | |
| 263 0, 4, 8, 12, 16, 20, 24, 28, 28, 32, 36, 40, 44, 48, 52, 56, 56, 52, 48, 44, 40, 36, 32, 28, 28, 24, 20, 16, 12, 8, 4, 0, | |
| 264 0, 4, 8, 8, 12, 12, 16, 20, 20, 24, 28, 28, 32, 32, 36, 40, 40, 36, 32, 32, 28, 28, 24, 20, 20, 16, 12, 12, 8, 8, 4, 0, | |
| 265 0, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 16, 20, 20, 20, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 8, 8, 8, 4, 4, 4, 0, | |
| 266 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, | |
| 2138 | 267 //error:0.000020 |
| 268 }; | |
| 269 static const uint8_t obmc16[256]={ | |
| 3206 | 270 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0, |
| 271 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4, | |
| 272 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4, | |
| 273 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8, | |
| 274 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8, | |
| 275 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12, | |
| 276 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12, | |
| 277 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16, | |
| 278 16, 44, 76,104,136,164,196,224,224,196,164,136,104, 76, 44, 16, | |
| 279 12, 40, 64, 92,116,144,168,196,196,168,144,116, 92, 64, 40, 12, | |
| 280 12, 32, 56, 76,100,120,144,164,164,144,120,100, 76, 56, 32, 12, | |
| 281 8, 28, 44, 64, 80,100,116,136,136,116,100, 80, 64, 44, 28, 8, | |
| 282 8, 20, 36, 48, 64, 76, 92,104,104, 92, 76, 64, 48, 36, 20, 8, | |
| 283 4, 16, 24, 36, 44, 56, 64, 76, 76, 64, 56, 44, 36, 24, 16, 4, | |
| 284 4, 8, 16, 20, 28, 32, 40, 44, 44, 40, 32, 28, 20, 16, 8, 4, | |
| 285 0, 4, 4, 8, 8, 12, 12, 16, 16, 12, 12, 8, 8, 4, 4, 0, | |
| 2138 | 286 //error:0.000015 |
| 287 }; | |
| 288 #else //64*cos | |
| 289 static const uint8_t obmc32[1024]={ | |
| 290 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 291 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
| 292 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
| 293 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, | |
| 294 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0, | |
| 295 0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0, | |
| 296 0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0, | |
| 297 0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0, | |
| 298 0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0, | |
| 299 0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0, | |
| 300 0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0, | |
| 301 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0, | |
| 302 0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0, | |
| 303 0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0, | |
| 304 0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0, | |
| 305 0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0, | |
| 306 0, 1, 4, 7,12,17,23,29,35,41,47,52,57,60,63,64,64,63,60,57,52,47,41,35,29,23,17,12, 7, 4, 1, 0, | |
| 307 0, 1, 4, 7,12,17,22,28,34,40,46,51,56,59,61,63,63,61,59,56,51,46,40,34,28,22,17,12, 7, 4, 1, 0, | |
| 308 0, 1, 3, 7,11,16,21,27,33,39,44,49,53,57,59,60,60,59,57,53,49,44,39,33,27,21,16,11, 7, 3, 1, 0, | |
| 309 0, 1, 3, 6,11,15,20,26,31,37,42,46,50,53,56,57,57,56,53,50,46,42,37,31,26,20,15,11, 6, 3, 1, 0, | |
| 310 0, 1, 3, 6, 9,14,19,24,29,34,38,43,46,49,51,52,52,51,49,46,43,38,34,29,24,19,14, 9, 6, 3, 1, 0, | |
| 311 0, 1, 3, 5, 9,12,17,21,26,30,35,38,42,44,46,47,47,46,44,42,38,35,30,26,21,17,12, 9, 5, 3, 1, 0, | |
| 312 0, 1, 3, 5, 7,11,15,19,23,26,30,34,37,39,40,41,41,40,39,37,34,30,26,23,19,15,11, 7, 5, 3, 1, 0, | |
| 313 0, 1, 2, 4, 6, 9,12,16,19,23,26,29,31,33,34,35,35,34,33,31,29,26,23,19,16,12, 9, 6, 4, 2, 1, 0, | |
| 314 0, 1, 2, 3, 5, 8,10,13,16,19,21,24,26,27,28,29,29,28,27,26,24,21,19,16,13,10, 8, 5, 3, 2, 1, 0, | |
| 315 0, 1, 1, 2, 4, 6, 8,10,12,15,17,19,20,21,22,23,23,22,21,20,19,17,15,12,10, 8, 6, 4, 2, 1, 1, 0, | |
| 316 0, 0, 1, 2, 3, 5, 6, 8, 9,11,12,14,15,16,17,17,17,17,16,15,14,12,11, 9, 8, 6, 5, 3, 2, 1, 0, 0, | |
| 317 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 9,10,11,11,12,12,12,12,11,11,10, 9, 7, 6, 5, 4, 3, 2, 1, 1, 0, 0, | |
| 318 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, | |
| 319 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, | |
| 320 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |
| 321 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
| 322 //error:0.000022 | |
| 323 }; | |
| 324 static const uint8_t obmc16[256]={ | |
| 325 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
| 326 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0, | |
| 327 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0, | |
| 328 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0, | |
| 329 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0, | |
| 330 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1, | |
| 331 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1, | |
| 332 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0, | |
| 333 0, 5,14,26,38,49,58,63,63,58,49,38,26,14, 5, 0, | |
| 334 1, 5,13,24,35,46,54,58,58,54,46,35,24,13, 5, 1, | |
| 335 1, 4,11,20,30,39,46,49,49,46,39,30,20,11, 4, 1, | |
| 336 0, 3, 8,16,23,30,35,38,38,35,30,23,16, 8, 3, 0, | |
| 337 0, 2, 6,10,15,20,24,26,26,24,20,15,10, 6, 2, 0, | |
| 338 0, 1, 3, 6, 8,11,13,14,14,13,11, 8, 6, 3, 1, 0, | |
| 339 0, 0, 1, 2, 3, 4, 5, 5, 5, 5, 4, 3, 2, 1, 0, 0, | |
| 340 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |
| 341 //error:0.000022 | |
| 342 }; | |
| 343 #endif | |
| 344 | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
345 //linear *64 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
346 static const uint8_t obmc8[64]={ |
| 3206 | 347 4, 12, 20, 28, 28, 20, 12, 4, |
| 348 12, 36, 60, 84, 84, 60, 36, 12, | |
| 349 20, 60,100,140,140,100, 60, 20, | |
| 350 28, 84,140,196,196,140, 84, 28, | |
| 351 28, 84,140,196,196,140, 84, 28, | |
| 352 20, 60,100,140,140,100, 60, 20, | |
| 353 12, 36, 60, 84, 84, 60, 36, 12, | |
| 354 4, 12, 20, 28, 28, 20, 12, 4, | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
355 //error:0.000000 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
356 }; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
357 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
358 //linear *64 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
359 static const uint8_t obmc4[16]={ |
| 3206 | 360 16, 48, 48, 16, |
| 361 48,144,144, 48, | |
| 362 48,144,144, 48, | |
| 363 16, 48, 48, 16, | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
364 //error:0.000000 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
365 }; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
366 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
367 static const uint8_t *obmc_tab[4]={ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
368 obmc32, obmc16, obmc8, obmc4 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
369 }; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
370 |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
371 static int scale_mv_ref[MAX_REF_FRAMES][MAX_REF_FRAMES]; |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
372 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
373 typedef struct BlockNode{ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
374 int16_t mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
375 int16_t my; |
| 3314 | 376 uint8_t ref; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
377 uint8_t color[3]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
378 uint8_t type; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
379 //#define TYPE_SPLIT 1 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
380 #define BLOCK_INTRA 1 |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
381 #define BLOCK_OPT 2 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
382 //#define TYPE_NOCOLOR 4 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
383 uint8_t level; //FIXME merge into type? |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
384 }BlockNode; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
385 |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
386 static const BlockNode null_block= { //FIXME add border maybe |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
387 .color= {128,128,128}, |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
388 .mx= 0, |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
389 .my= 0, |
| 3314 | 390 .ref= 0, |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
391 .type= 0, |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
392 .level= 0, |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
393 }; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
394 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
395 #define LOG2_MB_SIZE 4 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
396 #define MB_SIZE (1<<LOG2_MB_SIZE) |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
397 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
398 typedef struct x_and_coeff{ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
399 int16_t x; |
| 2596 | 400 uint16_t coeff; |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
401 } x_and_coeff; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
402 |
| 2138 | 403 typedef struct SubBand{ |
| 404 int level; | |
| 405 int stride; | |
| 406 int width; | |
| 407 int height; | |
| 408 int qlog; ///< log(qscale)/log[2^(1/6)] | |
| 409 DWTELEM *buf; | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
410 int buf_x_offset; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
411 int buf_y_offset; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
412 int stride_line; ///< Stride measured in lines, not pixels. |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
413 x_and_coeff * x_coeff; |
| 2138 | 414 struct SubBand *parent; |
| 415 uint8_t state[/*7*2*/ 7 + 512][32]; | |
| 416 }SubBand; | |
| 417 | |
| 418 typedef struct Plane{ | |
| 419 int width; | |
| 420 int height; | |
| 421 SubBand band[MAX_DECOMPOSITIONS][4]; | |
| 422 }Plane; | |
| 423 | |
| 424 typedef struct SnowContext{ | |
| 425 // MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX) | |
| 426 | |
| 427 AVCodecContext *avctx; | |
| 2335 | 428 RangeCoder c; |
| 2138 | 429 DSPContext dsp; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
430 AVFrame new_picture; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
431 AVFrame input_picture; ///< new_picture with the internal linesizes |
| 2138 | 432 AVFrame current_picture; |
| 3314 | 433 AVFrame last_picture[MAX_REF_FRAMES]; |
| 2138 | 434 AVFrame mconly_picture; |
| 435 // uint8_t q_context[16]; | |
| 436 uint8_t header_state[32]; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
437 uint8_t block_state[128 + 32*128]; |
| 2138 | 438 int keyframe; |
| 2199 | 439 int always_reset; |
| 2138 | 440 int version; |
| 441 int spatial_decomposition_type; | |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
442 int last_spatial_decomposition_type; |
| 2138 | 443 int temporal_decomposition_type; |
| 444 int spatial_decomposition_count; | |
| 445 int temporal_decomposition_count; | |
| 3314 | 446 int max_ref_frames; |
| 447 int ref_frames; | |
| 448 int16_t (*ref_mvs[MAX_REF_FRAMES])[2]; | |
| 449 uint32_t *ref_scores[MAX_REF_FRAMES]; | |
| 2138 | 450 DWTELEM *spatial_dwt_buffer; |
| 451 int colorspace_type; | |
| 452 int chroma_h_shift; | |
| 453 int chroma_v_shift; | |
| 454 int spatial_scalability; | |
| 455 int qlog; | |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
456 int last_qlog; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
457 int lambda; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
458 int lambda2; |
| 3313 | 459 int pass1_rc; |
| 2138 | 460 int mv_scale; |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
461 int last_mv_scale; |
| 2138 | 462 int qbias; |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
463 int last_qbias; |
| 2138 | 464 #define QBIAS_SHIFT 3 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
465 int b_width; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
466 int b_height; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
467 int block_max_depth; |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
468 int last_block_max_depth; |
| 2138 | 469 Plane plane[MAX_PLANES]; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
470 BlockNode *block; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
471 #define ME_CACHE_SIZE 1024 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
472 int me_cache[ME_CACHE_SIZE]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
473 int me_cache_generation; |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
474 slice_buffer sb; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
475 |
| 2138 | 476 MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX) |
| 477 }SnowContext; | |
| 478 | |
| 2562 | 479 typedef struct { |
| 480 DWTELEM *b0; | |
| 481 DWTELEM *b1; | |
| 482 DWTELEM *b2; | |
| 483 DWTELEM *b3; | |
| 484 int y; | |
| 485 } dwt_compose_t; | |
| 486 | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
487 #define slice_buffer_get_line(slice_buf, line_num) ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] : slice_buffer_load_line((slice_buf), (line_num))) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
488 //#define slice_buffer_get_line(slice_buf, line_num) (slice_buffer_load_line((slice_buf), (line_num))) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
489 |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
490 static void iterative_me(SnowContext *s); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
491 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
492 static void slice_buffer_init(slice_buffer * buf, int line_count, int max_allocated_lines, int line_width, DWTELEM * base_buffer) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
493 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
494 int i; |
| 2967 | 495 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
496 buf->base_buffer = base_buffer; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
497 buf->line_count = line_count; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
498 buf->line_width = line_width; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
499 buf->data_count = max_allocated_lines; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
500 buf->line = (DWTELEM * *) av_mallocz (sizeof(DWTELEM *) * line_count); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
501 buf->data_stack = (DWTELEM * *) av_malloc (sizeof(DWTELEM *) * max_allocated_lines); |
| 2967 | 502 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
503 for (i = 0; i < max_allocated_lines; i++) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
504 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
505 buf->data_stack[i] = (DWTELEM *) av_malloc (sizeof(DWTELEM) * line_width); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
506 } |
| 2967 | 507 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
508 buf->data_stack_top = max_allocated_lines - 1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
509 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
510 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
511 static DWTELEM * slice_buffer_load_line(slice_buffer * buf, int line) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
512 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
513 int offset; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
514 DWTELEM * buffer; |
| 2967 | 515 |
| 516 // av_log(NULL, AV_LOG_DEBUG, "Cache hit: %d\n", line); | |
| 517 | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
518 assert(buf->data_stack_top >= 0); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
519 // assert(!buf->line[line]); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
520 if (buf->line[line]) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
521 return buf->line[line]; |
| 2967 | 522 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
523 offset = buf->line_width * line; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
524 buffer = buf->data_stack[buf->data_stack_top]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
525 buf->data_stack_top--; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
526 buf->line[line] = buffer; |
| 2967 | 527 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
528 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_load_line: line: %d remaining: %d\n", line, buf->data_stack_top + 1); |
| 2967 | 529 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
530 return buffer; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
531 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
532 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
533 static void slice_buffer_release(slice_buffer * buf, int line) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
534 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
535 int offset; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
536 DWTELEM * buffer; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
537 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
538 assert(line >= 0 && line < buf->line_count); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
539 assert(buf->line[line]); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
540 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
541 offset = buf->line_width * line; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
542 buffer = buf->line[line]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
543 buf->data_stack_top++; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
544 buf->data_stack[buf->data_stack_top] = buffer; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
545 buf->line[line] = NULL; |
| 2967 | 546 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
547 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_release: line: %d remaining: %d\n", line, buf->data_stack_top + 1); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
548 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
549 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
550 static void slice_buffer_flush(slice_buffer * buf) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
551 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
552 int i; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
553 for (i = 0; i < buf->line_count; i++) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
554 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
555 if (buf->line[i]) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
556 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
557 // av_log(NULL, AV_LOG_DEBUG, "slice_buffer_flush: line: %d \n", i); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
558 slice_buffer_release(buf, i); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
559 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
560 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
561 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
562 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
563 static void slice_buffer_destroy(slice_buffer * buf) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
564 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
565 int i; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
566 slice_buffer_flush(buf); |
| 2967 | 567 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
568 for (i = buf->data_count - 1; i >= 0; i--) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
569 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
570 assert(buf->data_stack[i]); |
| 3190 | 571 av_freep(&buf->data_stack[i]); |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
572 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
573 assert(buf->data_stack); |
| 3190 | 574 av_freep(&buf->data_stack); |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
575 assert(buf->line); |
| 3190 | 576 av_freep(&buf->line); |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
577 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
578 |
| 2979 | 579 #ifdef __sgi |
|
2368
a7ac68734a91
fix for build on IRIX by (Michel Bardiaux {mbardiaux peaktime be})
michael
parents:
2335
diff
changeset
|
580 // Avoid a name clash on SGI IRIX |
| 2979 | 581 #undef qexp |
|
2368
a7ac68734a91
fix for build on IRIX by (Michel Bardiaux {mbardiaux peaktime be})
michael
parents:
2335
diff
changeset
|
582 #endif |
| 2246 | 583 #define QEXPSHIFT (7-FRAC_BITS+8) //FIXME try to change this to 0 |
| 2600 | 584 static uint8_t qexp[QROOT]; |
| 2138 | 585 |
| 586 static inline int mirror(int v, int m){ | |
| 2998 | 587 while((unsigned)v > (unsigned)m){ |
| 588 v=-v; | |
| 589 if(v<0) v+= 2*m; | |
| 590 } | |
| 591 return v; | |
| 2138 | 592 } |
| 593 | |
| 2335 | 594 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){ |
| 2138 | 595 int i; |
| 596 | |
| 597 if(v){ | |
| 4001 | 598 const int a= FFABS(v); |
| 2138 | 599 const int e= av_log2(a); |
| 600 #if 1 | |
| 2967 | 601 const int el= FFMIN(e, 10); |
| 2335 | 602 put_rac(c, state+0, 0); |
| 2138 | 603 |
| 604 for(i=0; i<el; i++){ | |
| 2335 | 605 put_rac(c, state+1+i, 1); //1..10 |
| 2138 | 606 } |
| 607 for(; i<e; i++){ | |
| 2335 | 608 put_rac(c, state+1+9, 1); //1..10 |
| 2138 | 609 } |
| 2335 | 610 put_rac(c, state+1+FFMIN(i,9), 0); |
| 2138 | 611 |
| 612 for(i=e-1; i>=el; i--){ | |
| 2335 | 613 put_rac(c, state+22+9, (a>>i)&1); //22..31 |
| 2138 | 614 } |
| 615 for(; i>=0; i--){ | |
| 2335 | 616 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
| 2138 | 617 } |
| 618 | |
| 619 if(is_signed) | |
| 2335 | 620 put_rac(c, state+11 + el, v < 0); //11..21 |
| 2138 | 621 #else |
| 2967 | 622 |
| 2335 | 623 put_rac(c, state+0, 0); |
| 2138 | 624 if(e<=9){ |
| 625 for(i=0; i<e; i++){ | |
| 2335 | 626 put_rac(c, state+1+i, 1); //1..10 |
| 2138 | 627 } |
| 2335 | 628 put_rac(c, state+1+i, 0); |
| 2138 | 629 |
| 630 for(i=e-1; i>=0; i--){ | |
| 2335 | 631 put_rac(c, state+22+i, (a>>i)&1); //22..31 |
| 2138 | 632 } |
| 633 | |
| 634 if(is_signed) | |
| 2335 | 635 put_rac(c, state+11 + e, v < 0); //11..21 |
| 2138 | 636 }else{ |
| 637 for(i=0; i<e; i++){ | |
| 2335 | 638 put_rac(c, state+1+FFMIN(i,9), 1); //1..10 |
| 2138 | 639 } |
| 2335 | 640 put_rac(c, state+1+FFMIN(i,9), 0); |
| 2138 | 641 |
| 642 for(i=e-1; i>=0; i--){ | |
| 2335 | 643 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31 |
| 2138 | 644 } |
| 645 | |
| 646 if(is_signed) | |
| 2335 | 647 put_rac(c, state+11 + FFMIN(e,10), v < 0); //11..21 |
| 2138 | 648 } |
| 649 #endif | |
| 650 }else{ | |
| 2335 | 651 put_rac(c, state+0, 1); |
| 2138 | 652 } |
| 653 } | |
| 654 | |
| 2335 | 655 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){ |
| 656 if(get_rac(c, state+0)) | |
| 2138 | 657 return 0; |
| 658 else{ | |
|
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
659 int i, e, a; |
|
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
660 e= 0; |
| 2335 | 661 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10 |
|
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
662 e++; |
| 2138 | 663 } |
| 664 | |
|
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
665 a= 1; |
|
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
666 for(i=e-1; i>=0; i--){ |
| 2335 | 667 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31 |
|
2240
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
668 } |
|
c46fed9b7575
simplify getsymbol patch by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents:
2232
diff
changeset
|
669 |
| 2335 | 670 if(is_signed && get_rac(c, state+11 + FFMIN(e,10))) //11..21 |
| 2138 | 671 return -a; |
| 672 else | |
| 673 return a; | |
| 674 } | |
| 675 } | |
| 676 | |
| 2335 | 677 static inline void put_symbol2(RangeCoder *c, uint8_t *state, int v, int log2){ |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
678 int i; |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
679 int r= log2>=0 ? 1<<log2 : 1; |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
680 |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
681 assert(v>=0); |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
682 assert(log2>=-4); |
|
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
683 |
|
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
684 while(v >= r){ |
| 2335 | 685 put_rac(c, state+4+log2, 1); |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
686 v -= r; |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
687 log2++; |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
688 if(log2>0) r+=r; |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
689 } |
| 2335 | 690 put_rac(c, state+4+log2, 0); |
| 2967 | 691 |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
692 for(i=log2-1; i>=0; i--){ |
| 2335 | 693 put_rac(c, state+31-i, (v>>i)&1); |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
694 } |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
695 } |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
696 |
| 2335 | 697 static inline int get_symbol2(RangeCoder *c, uint8_t *state, int log2){ |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
698 int i; |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
699 int r= log2>=0 ? 1<<log2 : 1; |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
700 int v=0; |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
701 |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
702 assert(log2>=-4); |
|
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
703 |
| 2335 | 704 while(get_rac(c, state+4+log2)){ |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
705 v+= r; |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
706 log2++; |
|
2159
7f42295c1517
improved magnitude coding, 0.2% lower bitrate (foreman@352x288 qscale 1 and 8)
michael
parents:
2156
diff
changeset
|
707 if(log2>0) r+=r; |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
708 } |
| 2967 | 709 |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
710 for(i=log2-1; i>=0; i--){ |
| 2335 | 711 v+= get_rac(c, state+31-i)<<i; |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
712 } |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
713 |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
714 return v; |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
715 } |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
716 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
717 static av_always_inline void lift(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){ |
| 2138 | 718 const int mirror_left= !highpass; |
| 719 const int mirror_right= (width&1) ^ highpass; | |
| 720 const int w= (width>>1) - 1 + (highpass & width); | |
| 721 int i; | |
| 722 | |
| 723 #define LIFT(src, ref, inv) ((src) + ((inv) ? - (ref) : + (ref))) | |
| 724 if(mirror_left){ | |
| 725 dst[0] = LIFT(src[0], ((mul*2*ref[0]+add)>>shift), inverse); | |
| 726 dst += dst_step; | |
| 727 src += src_step; | |
| 728 } | |
| 2967 | 729 |
| 2138 | 730 for(i=0; i<w; i++){ |
| 731 dst[i*dst_step] = LIFT(src[i*src_step], ((mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add)>>shift), inverse); | |
| 732 } | |
| 2967 | 733 |
| 2138 | 734 if(mirror_right){ |
| 735 dst[w*dst_step] = LIFT(src[w*src_step], ((mul*2*ref[w*ref_step]+add)>>shift), inverse); | |
| 736 } | |
| 737 } | |
| 738 | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
739 #ifndef lift5 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
740 static av_always_inline void lift5(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){ |
| 2138 | 741 const int mirror_left= !highpass; |
| 742 const int mirror_right= (width&1) ^ highpass; | |
| 743 const int w= (width>>1) - 1 + (highpass & width); | |
| 744 int i; | |
| 745 | |
| 746 if(mirror_left){ | |
| 747 int r= 3*2*ref[0]; | |
| 748 r += r>>4; | |
| 749 r += r>>8; | |
| 750 dst[0] = LIFT(src[0], ((r+add)>>shift), inverse); | |
| 751 dst += dst_step; | |
| 752 src += src_step; | |
| 753 } | |
| 2967 | 754 |
| 2138 | 755 for(i=0; i<w; i++){ |
| 756 int r= 3*(ref[i*ref_step] + ref[(i+1)*ref_step]); | |
| 757 r += r>>4; | |
| 758 r += r>>8; | |
| 759 dst[i*dst_step] = LIFT(src[i*src_step], ((r+add)>>shift), inverse); | |
| 760 } | |
| 2967 | 761 |
| 2138 | 762 if(mirror_right){ |
| 763 int r= 3*2*ref[w*ref_step]; | |
| 764 r += r>>4; | |
| 765 r += r>>8; | |
| 766 dst[w*dst_step] = LIFT(src[w*src_step], ((r+add)>>shift), inverse); | |
| 767 } | |
| 768 } | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
769 #endif |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
770 |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
771 #ifndef liftS |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
772 static av_always_inline void liftS(DWTELEM *dst, DWTELEM *src, DWTELEM *ref, int dst_step, int src_step, int ref_step, int width, int mul, int add, int shift, int highpass, int inverse){ |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
773 const int mirror_left= !highpass; |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
774 const int mirror_right= (width&1) ^ highpass; |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
775 const int w= (width>>1) - 1 + (highpass & width); |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
776 int i; |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
777 |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
778 assert(shift == 4); |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
779 #define LIFTS(src, ref, inv) ((inv) ? (src) - (((ref) - 4*(src))>>shift): (16*4*(src) + 4*(ref) + 8 + (5<<27))/(5*16) - (1<<23)) |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
780 if(mirror_left){ |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
781 dst[0] = LIFTS(src[0], mul*2*ref[0]+add, inverse); |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
782 dst += dst_step; |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
783 src += src_step; |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
784 } |
| 2967 | 785 |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
786 for(i=0; i<w; i++){ |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
787 dst[i*dst_step] = LIFTS(src[i*src_step], mul*(ref[i*ref_step] + ref[(i+1)*ref_step])+add, inverse); |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
788 } |
| 2967 | 789 |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
790 if(mirror_right){ |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
791 dst[w*dst_step] = LIFTS(src[w*src_step], mul*2*ref[w*ref_step]+add, inverse); |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
792 } |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
793 } |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
794 #endif |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
795 |
| 2138 | 796 |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
797 static void inplace_lift(DWTELEM *dst, int width, int *coeffs, int n, int shift, int start, int inverse){ |
| 2138 | 798 int x, i; |
| 2967 | 799 |
| 2138 | 800 for(x=start; x<width; x+=2){ |
| 801 int64_t sum=0; | |
| 802 | |
| 803 for(i=0; i<n; i++){ | |
| 804 int x2= x + 2*i - n + 1; | |
| 805 if (x2< 0) x2= -x2; | |
| 806 else if(x2>=width) x2= 2*width-x2-2; | |
| 807 sum += coeffs[i]*(int64_t)dst[x2]; | |
| 808 } | |
| 809 if(inverse) dst[x] -= (sum + (1<<shift)/2)>>shift; | |
| 810 else dst[x] += (sum + (1<<shift)/2)>>shift; | |
| 811 } | |
| 812 } | |
| 813 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
814 static void inplace_liftV(DWTELEM *dst, int width, int height, int stride, int *coeffs, int n, int shift, int start, int inverse){ |
| 2138 | 815 int x, y, i; |
| 816 for(y=start; y<height; y+=2){ | |
| 817 for(x=0; x<width; x++){ | |
| 818 int64_t sum=0; | |
| 2967 | 819 |
| 2138 | 820 for(i=0; i<n; i++){ |
| 821 int y2= y + 2*i - n + 1; | |
| 822 if (y2< 0) y2= -y2; | |
| 823 else if(y2>=height) y2= 2*height-y2-2; | |
| 824 sum += coeffs[i]*(int64_t)dst[x + y2*stride]; | |
| 825 } | |
| 826 if(inverse) dst[x + y*stride] -= (sum + (1<<shift)/2)>>shift; | |
| 827 else dst[x + y*stride] += (sum + (1<<shift)/2)>>shift; | |
| 828 } | |
| 829 } | |
| 830 } | |
| 831 | |
| 832 #define SCALEX 1 | |
| 833 #define LX0 0 | |
| 834 #define LX1 1 | |
| 835 | |
| 2139 | 836 #if 0 // more accurate 9/7 |
| 2138 | 837 #define N1 2 |
| 838 #define SHIFT1 14 | |
| 839 #define COEFFS1 (int[]){-25987,-25987} | |
| 840 #define N2 2 | |
| 841 #define SHIFT2 19 | |
| 842 #define COEFFS2 (int[]){-27777,-27777} | |
| 843 #define N3 2 | |
| 844 #define SHIFT3 15 | |
| 845 #define COEFFS3 (int[]){28931,28931} | |
| 846 #define N4 2 | |
| 847 #define SHIFT4 15 | |
| 848 #define COEFFS4 (int[]){14533,14533} | |
| 849 #elif 1 // 13/7 CRF | |
| 850 #define N1 4 | |
| 851 #define SHIFT1 4 | |
| 852 #define COEFFS1 (int[]){1,-9,-9,1} | |
| 2139 | 853 #define N2 4 |
| 2138 | 854 #define SHIFT2 4 |
| 855 #define COEFFS2 (int[]){-1,5,5,-1} | |
| 856 #define N3 0 | |
| 857 #define SHIFT3 1 | |
| 858 #define COEFFS3 NULL | |
| 859 #define N4 0 | |
| 860 #define SHIFT4 1 | |
| 861 #define COEFFS4 NULL | |
| 862 #elif 1 // 3/5 | |
| 863 #define LX0 1 | |
| 864 #define LX1 0 | |
| 865 #define SCALEX 0.5 | |
| 866 #define N1 2 | |
| 867 #define SHIFT1 1 | |
| 868 #define COEFFS1 (int[]){1,1} | |
| 869 #define N2 2 | |
| 870 #define SHIFT2 2 | |
| 871 #define COEFFS2 (int[]){-1,-1} | |
| 872 #define N3 0 | |
| 873 #define SHIFT3 0 | |
| 874 #define COEFFS3 NULL | |
| 875 #define N4 0 | |
| 876 #define SHIFT4 0 | |
| 877 #define COEFFS4 NULL | |
| 2967 | 878 #elif 1 // 11/5 |
| 2138 | 879 #define N1 0 |
| 880 #define SHIFT1 1 | |
| 881 #define COEFFS1 NULL | |
| 882 #define N2 2 | |
| 883 #define SHIFT2 2 | |
| 884 #define COEFFS2 (int[]){-1,-1} | |
| 885 #define N3 2 | |
| 886 #define SHIFT3 0 | |
| 887 #define COEFFS3 (int[]){-1,-1} | |
| 888 #define N4 4 | |
| 889 #define SHIFT4 7 | |
| 890 #define COEFFS4 (int[]){-5,29,29,-5} | |
| 891 #define SCALEX 4 | |
| 892 #elif 1 // 9/7 CDF | |
| 893 #define N1 2 | |
| 894 #define SHIFT1 7 | |
| 895 #define COEFFS1 (int[]){-203,-203} | |
| 896 #define N2 2 | |
| 897 #define SHIFT2 12 | |
| 898 #define COEFFS2 (int[]){-217,-217} | |
| 899 #define N3 2 | |
| 900 #define SHIFT3 7 | |
| 901 #define COEFFS3 (int[]){113,113} | |
| 902 #define N4 2 | |
| 903 #define SHIFT4 9 | |
| 904 #define COEFFS4 (int[]){227,227} | |
| 905 #define SCALEX 1 | |
| 906 #elif 1 // 7/5 CDF | |
| 907 #define N1 0 | |
| 908 #define SHIFT1 1 | |
| 909 #define COEFFS1 NULL | |
| 910 #define N2 2 | |
| 911 #define SHIFT2 2 | |
| 912 #define COEFFS2 (int[]){-1,-1} | |
| 913 #define N3 2 | |
| 914 #define SHIFT3 0 | |
| 915 #define COEFFS3 (int[]){-1,-1} | |
| 916 #define N4 2 | |
| 917 #define SHIFT4 4 | |
| 918 #define COEFFS4 (int[]){3,3} | |
| 919 #elif 1 // 9/7 MN | |
| 920 #define N1 4 | |
| 921 #define SHIFT1 4 | |
| 922 #define COEFFS1 (int[]){1,-9,-9,1} | |
| 923 #define N2 2 | |
| 924 #define SHIFT2 2 | |
| 925 #define COEFFS2 (int[]){1,1} | |
| 926 #define N3 0 | |
| 927 #define SHIFT3 1 | |
| 928 #define COEFFS3 NULL | |
| 929 #define N4 0 | |
| 930 #define SHIFT4 1 | |
| 931 #define COEFFS4 NULL | |
| 932 #else // 13/7 CRF | |
| 933 #define N1 4 | |
| 934 #define SHIFT1 4 | |
| 935 #define COEFFS1 (int[]){1,-9,-9,1} | |
| 936 #define N2 4 | |
| 937 #define SHIFT2 4 | |
| 938 #define COEFFS2 (int[]){-1,5,5,-1} | |
| 939 #define N3 0 | |
| 940 #define SHIFT3 1 | |
| 941 #define COEFFS3 NULL | |
| 942 #define N4 0 | |
| 943 #define SHIFT4 1 | |
| 944 #define COEFFS4 NULL | |
| 945 #endif | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
946 static void horizontal_decomposeX(DWTELEM *b, int width){ |
|
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
947 DWTELEM temp[width]; |
| 2138 | 948 const int width2= width>>1; |
| 949 const int w2= (width+1)>>1; | |
| 2893 | 950 int x; |
| 2138 | 951 |
| 952 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 0); | |
| 953 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 0); | |
| 954 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 0); | |
| 955 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 0); | |
| 2967 | 956 |
| 2138 | 957 for(x=0; x<width2; x++){ |
| 958 temp[x ]= b[2*x ]; | |
| 959 temp[x+w2]= b[2*x + 1]; | |
| 960 } | |
| 961 if(width&1) | |
| 962 temp[x ]= b[2*x ]; | |
| 963 memcpy(b, temp, width*sizeof(int)); | |
| 964 } | |
| 965 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
966 static void horizontal_composeX(DWTELEM *b, int width){ |
|
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
967 DWTELEM temp[width]; |
| 2138 | 968 const int width2= width>>1; |
| 2893 | 969 int x; |
| 2138 | 970 const int w2= (width+1)>>1; |
| 971 | |
| 972 memcpy(temp, b, width*sizeof(int)); | |
| 973 for(x=0; x<width2; x++){ | |
| 974 b[2*x ]= temp[x ]; | |
| 975 b[2*x + 1]= temp[x+w2]; | |
| 976 } | |
| 977 if(width&1) | |
| 978 b[2*x ]= temp[x ]; | |
| 979 | |
| 980 inplace_lift(b, width, COEFFS4, N4, SHIFT4, LX0, 1); | |
| 981 inplace_lift(b, width, COEFFS3, N3, SHIFT3, LX1, 1); | |
| 982 inplace_lift(b, width, COEFFS2, N2, SHIFT2, LX0, 1); | |
| 983 inplace_lift(b, width, COEFFS1, N1, SHIFT1, LX1, 1); | |
| 984 } | |
| 985 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
986 static void spatial_decomposeX(DWTELEM *buffer, int width, int height, int stride){ |
| 2138 | 987 int x, y; |
| 2967 | 988 |
| 2138 | 989 for(y=0; y<height; y++){ |
| 990 for(x=0; x<width; x++){ | |
| 991 buffer[y*stride + x] *= SCALEX; | |
| 992 } | |
| 993 } | |
| 994 | |
| 995 for(y=0; y<height; y++){ | |
| 996 horizontal_decomposeX(buffer + y*stride, width); | |
| 997 } | |
| 2967 | 998 |
| 2138 | 999 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 0); |
| 1000 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 0); | |
| 1001 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 0); | |
| 2967 | 1002 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 0); |
| 2138 | 1003 } |
| 1004 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1005 static void spatial_composeX(DWTELEM *buffer, int width, int height, int stride){ |
| 2138 | 1006 int x, y; |
| 2967 | 1007 |
| 2138 | 1008 inplace_liftV(buffer, width, height, stride, COEFFS4, N4, SHIFT4, LX0, 1); |
| 1009 inplace_liftV(buffer, width, height, stride, COEFFS3, N3, SHIFT3, LX1, 1); | |
| 1010 inplace_liftV(buffer, width, height, stride, COEFFS2, N2, SHIFT2, LX0, 1); | |
| 1011 inplace_liftV(buffer, width, height, stride, COEFFS1, N1, SHIFT1, LX1, 1); | |
| 1012 | |
| 1013 for(y=0; y<height; y++){ | |
| 1014 horizontal_composeX(buffer + y*stride, width); | |
| 1015 } | |
| 1016 | |
| 1017 for(y=0; y<height; y++){ | |
| 1018 for(x=0; x<width; x++){ | |
| 1019 buffer[y*stride + x] /= SCALEX; | |
| 1020 } | |
| 1021 } | |
| 1022 } | |
| 1023 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1024 static void horizontal_decompose53i(DWTELEM *b, int width){ |
|
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1025 DWTELEM temp[width]; |
| 2138 | 1026 const int width2= width>>1; |
| 2893 | 1027 int x; |
| 2138 | 1028 const int w2= (width+1)>>1; |
| 1029 | |
| 1030 for(x=0; x<width2; x++){ | |
| 1031 temp[x ]= b[2*x ]; | |
| 1032 temp[x+w2]= b[2*x + 1]; | |
| 1033 } | |
| 1034 if(width&1) | |
| 1035 temp[x ]= b[2*x ]; | |
| 1036 #if 0 | |
| 2893 | 1037 { |
| 1038 int A1,A2,A3,A4; | |
| 2138 | 1039 A2= temp[1 ]; |
| 1040 A4= temp[0 ]; | |
| 1041 A1= temp[0+width2]; | |
| 1042 A1 -= (A2 + A4)>>1; | |
| 1043 A4 += (A1 + 1)>>1; | |
| 1044 b[0+width2] = A1; | |
| 1045 b[0 ] = A4; | |
| 1046 for(x=1; x+1<width2; x+=2){ | |
| 1047 A3= temp[x+width2]; | |
| 1048 A4= temp[x+1 ]; | |
| 1049 A3 -= (A2 + A4)>>1; | |
| 1050 A2 += (A1 + A3 + 2)>>2; | |
| 1051 b[x+width2] = A3; | |
| 1052 b[x ] = A2; | |
| 1053 | |
| 1054 A1= temp[x+1+width2]; | |
| 1055 A2= temp[x+2 ]; | |
| 1056 A1 -= (A2 + A4)>>1; | |
| 1057 A4 += (A1 + A3 + 2)>>2; | |
| 1058 b[x+1+width2] = A1; | |
| 1059 b[x+1 ] = A4; | |
| 1060 } | |
| 1061 A3= temp[width-1]; | |
| 1062 A3 -= A2; | |
| 1063 A2 += (A1 + A3 + 2)>>2; | |
| 1064 b[width -1] = A3; | |
| 1065 b[width2-1] = A2; | |
| 2893 | 1066 } |
| 2967 | 1067 #else |
| 2138 | 1068 lift(b+w2, temp+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 0); |
| 1069 lift(b , temp , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 0); | |
| 1070 #endif | |
| 1071 } | |
| 1072 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1073 static void vertical_decompose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1074 int i; |
| 2967 | 1075 |
| 2138 | 1076 for(i=0; i<width; i++){ |
| 1077 b1[i] -= (b0[i] + b2[i])>>1; | |
| 1078 } | |
| 1079 } | |
| 1080 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1081 static void vertical_decompose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1082 int i; |
| 2967 | 1083 |
| 2138 | 1084 for(i=0; i<width; i++){ |
| 1085 b1[i] += (b0[i] + b2[i] + 2)>>2; | |
| 1086 } | |
| 1087 } | |
| 1088 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1089 static void spatial_decompose53i(DWTELEM *buffer, int width, int height, int stride){ |
| 2198 | 1090 int y; |
| 2138 | 1091 DWTELEM *b0= buffer + mirror(-2-1, height-1)*stride; |
| 1092 DWTELEM *b1= buffer + mirror(-2 , height-1)*stride; | |
| 2967 | 1093 |
| 2138 | 1094 for(y=-2; y<height; y+=2){ |
| 1095 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride; | |
| 1096 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride; | |
| 1097 | |
| 1098 {START_TIMER | |
| 2998 | 1099 if(y+1<(unsigned)height) horizontal_decompose53i(b2, width); |
| 1100 if(y+2<(unsigned)height) horizontal_decompose53i(b3, width); | |
| 2138 | 1101 STOP_TIMER("horizontal_decompose53i")} |
| 2967 | 1102 |
| 2138 | 1103 {START_TIMER |
| 2998 | 1104 if(y+1<(unsigned)height) vertical_decompose53iH0(b1, b2, b3, width); |
| 1105 if(y+0<(unsigned)height) vertical_decompose53iL0(b0, b1, b2, width); | |
| 2138 | 1106 STOP_TIMER("vertical_decompose53i*")} |
| 2967 | 1107 |
| 2138 | 1108 b0=b2; |
| 1109 b1=b3; | |
| 1110 } | |
| 1111 } | |
| 1112 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1113 static void horizontal_decompose97i(DWTELEM *b, int width){ |
|
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1114 DWTELEM temp[width]; |
| 2138 | 1115 const int w2= (width+1)>>1; |
| 1116 | |
| 1117 lift (temp+w2, b +1, b , 1, 2, 2, width, -W_AM, W_AO, W_AS, 1, 0); | |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1118 liftS(temp , b , temp+w2, 1, 2, 1, width, -W_BM, W_BO, W_BS, 0, 0); |
| 2138 | 1119 lift5(b +w2, temp+w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 0); |
| 1120 lift (b , temp , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 0); | |
| 1121 } | |
| 1122 | |
| 1123 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1124 static void vertical_decompose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1125 int i; |
| 2967 | 1126 |
| 2138 | 1127 for(i=0; i<width; i++){ |
| 1128 b1[i] -= (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
| 1129 } | |
| 1130 } | |
| 1131 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1132 static void vertical_decompose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1133 int i; |
| 2967 | 1134 |
| 2138 | 1135 for(i=0; i<width; i++){ |
| 1136 #ifdef lift5 | |
| 1137 b1[i] += (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
| 1138 #else | |
| 1139 int r= 3*(b0[i] + b2[i]); | |
| 1140 r+= r>>4; | |
| 1141 r+= r>>8; | |
| 1142 b1[i] += (r+W_CO)>>W_CS; | |
| 1143 #endif | |
| 1144 } | |
| 1145 } | |
| 1146 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1147 static void vertical_decompose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1148 int i; |
| 2967 | 1149 |
| 2138 | 1150 for(i=0; i<width; i++){ |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1151 #ifdef liftS |
| 2138 | 1152 b1[i] -= (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1153 #else |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1154 b1[i] = (16*4*b1[i] - 4*(b0[i] + b2[i]) + 8*5 + (5<<27)) / (5*16) - (1<<23); |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1155 #endif |
| 2138 | 1156 } |
| 1157 } | |
| 1158 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1159 static void vertical_decompose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1160 int i; |
| 2967 | 1161 |
| 2138 | 1162 for(i=0; i<width; i++){ |
| 1163 b1[i] += (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
| 1164 } | |
| 1165 } | |
| 1166 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1167 static void spatial_decompose97i(DWTELEM *buffer, int width, int height, int stride){ |
| 2198 | 1168 int y; |
| 2138 | 1169 DWTELEM *b0= buffer + mirror(-4-1, height-1)*stride; |
| 1170 DWTELEM *b1= buffer + mirror(-4 , height-1)*stride; | |
| 1171 DWTELEM *b2= buffer + mirror(-4+1, height-1)*stride; | |
| 1172 DWTELEM *b3= buffer + mirror(-4+2, height-1)*stride; | |
| 2967 | 1173 |
| 2138 | 1174 for(y=-4; y<height; y+=2){ |
| 1175 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride; | |
| 1176 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride; | |
| 1177 | |
| 1178 {START_TIMER | |
| 2998 | 1179 if(y+3<(unsigned)height) horizontal_decompose97i(b4, width); |
| 1180 if(y+4<(unsigned)height) horizontal_decompose97i(b5, width); | |
| 2138 | 1181 if(width>400){ |
| 1182 STOP_TIMER("horizontal_decompose97i") | |
| 1183 }} | |
| 2967 | 1184 |
| 2138 | 1185 {START_TIMER |
| 2998 | 1186 if(y+3<(unsigned)height) vertical_decompose97iH0(b3, b4, b5, width); |
| 1187 if(y+2<(unsigned)height) vertical_decompose97iL0(b2, b3, b4, width); | |
| 1188 if(y+1<(unsigned)height) vertical_decompose97iH1(b1, b2, b3, width); | |
| 1189 if(y+0<(unsigned)height) vertical_decompose97iL1(b0, b1, b2, width); | |
| 2138 | 1190 |
| 1191 if(width>400){ | |
| 1192 STOP_TIMER("vertical_decompose97i") | |
| 1193 }} | |
| 2967 | 1194 |
| 2138 | 1195 b0=b2; |
| 1196 b1=b3; | |
| 1197 b2=b4; | |
| 1198 b3=b5; | |
| 1199 } | |
| 1200 } | |
| 1201 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1202 void ff_spatial_dwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
| 2138 | 1203 int level; |
| 2967 | 1204 |
| 2164 | 1205 for(level=0; level<decomposition_count; level++){ |
| 1206 switch(type){ | |
| 3326 | 1207 case DWT_97: spatial_decompose97i(buffer, width>>level, height>>level, stride<<level); break; |
| 1208 case DWT_53: spatial_decompose53i(buffer, width>>level, height>>level, stride<<level); break; | |
| 1209 case DWT_X: spatial_decomposeX (buffer, width>>level, height>>level, stride<<level); break; | |
| 2138 | 1210 } |
| 1211 } | |
| 1212 } | |
| 1213 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1214 static void horizontal_compose53i(DWTELEM *b, int width){ |
|
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1215 DWTELEM temp[width]; |
| 2138 | 1216 const int width2= width>>1; |
| 1217 const int w2= (width+1)>>1; | |
| 2893 | 1218 int x; |
| 2138 | 1219 |
| 1220 #if 0 | |
| 2893 | 1221 int A1,A2,A3,A4; |
| 2138 | 1222 A2= temp[1 ]; |
| 1223 A4= temp[0 ]; | |
| 1224 A1= temp[0+width2]; | |
| 1225 A1 -= (A2 + A4)>>1; | |
| 1226 A4 += (A1 + 1)>>1; | |
| 1227 b[0+width2] = A1; | |
| 1228 b[0 ] = A4; | |
| 1229 for(x=1; x+1<width2; x+=2){ | |
| 1230 A3= temp[x+width2]; | |
| 1231 A4= temp[x+1 ]; | |
| 1232 A3 -= (A2 + A4)>>1; | |
| 1233 A2 += (A1 + A3 + 2)>>2; | |
| 1234 b[x+width2] = A3; | |
| 1235 b[x ] = A2; | |
| 1236 | |
| 1237 A1= temp[x+1+width2]; | |
| 1238 A2= temp[x+2 ]; | |
| 1239 A1 -= (A2 + A4)>>1; | |
| 1240 A4 += (A1 + A3 + 2)>>2; | |
| 1241 b[x+1+width2] = A1; | |
| 1242 b[x+1 ] = A4; | |
| 1243 } | |
| 1244 A3= temp[width-1]; | |
| 1245 A3 -= A2; | |
| 1246 A2 += (A1 + A3 + 2)>>2; | |
| 1247 b[width -1] = A3; | |
| 1248 b[width2-1] = A2; | |
| 2967 | 1249 #else |
| 2138 | 1250 lift(temp , b , b+w2, 1, 1, 1, width, 1, 2, 2, 0, 1); |
| 1251 lift(temp+w2, b+w2, temp, 1, 1, 1, width, -1, 0, 1, 1, 1); | |
| 1252 #endif | |
| 1253 for(x=0; x<width2; x++){ | |
| 1254 b[2*x ]= temp[x ]; | |
| 1255 b[2*x + 1]= temp[x+w2]; | |
| 1256 } | |
| 1257 if(width&1) | |
| 1258 b[2*x ]= temp[x ]; | |
| 1259 } | |
| 1260 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1261 static void vertical_compose53iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1262 int i; |
| 2967 | 1263 |
| 2138 | 1264 for(i=0; i<width; i++){ |
| 1265 b1[i] += (b0[i] + b2[i])>>1; | |
| 1266 } | |
| 1267 } | |
| 1268 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1269 static void vertical_compose53iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1270 int i; |
| 2967 | 1271 |
| 2138 | 1272 for(i=0; i<width; i++){ |
| 1273 b1[i] -= (b0[i] + b2[i] + 2)>>2; | |
| 1274 } | |
| 1275 } | |
| 1276 | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1277 static void spatial_compose53i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1278 cs->b0 = slice_buffer_get_line(sb, mirror(-1-1, height-1) * stride_line); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1279 cs->b1 = slice_buffer_get_line(sb, mirror(-1 , height-1) * stride_line); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1280 cs->y = -1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1281 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1282 |
| 2562 | 1283 static void spatial_compose53i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){ |
| 1284 cs->b0 = buffer + mirror(-1-1, height-1)*stride; | |
| 1285 cs->b1 = buffer + mirror(-1 , height-1)*stride; | |
| 1286 cs->y = -1; | |
| 1287 } | |
| 1288 | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1289 static void spatial_compose53i_dy_buffered(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1290 int y= cs->y; |
| 2967 | 1291 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1292 DWTELEM *b0= cs->b0; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1293 DWTELEM *b1= cs->b1; |
| 3012 | 1294 DWTELEM *b2= slice_buffer_get_line(sb, mirror(y+1, height-1) * stride_line); |
| 1295 DWTELEM *b3= slice_buffer_get_line(sb, mirror(y+2, height-1) * stride_line); | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1296 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1297 {START_TIMER |
| 2998 | 1298 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
| 1299 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1300 STOP_TIMER("vertical_compose53i*")} |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1301 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1302 {START_TIMER |
| 2998 | 1303 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
| 1304 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1305 STOP_TIMER("horizontal_compose53i")} |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1306 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1307 cs->b0 = b2; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1308 cs->b1 = b3; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1309 cs->y += 2; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1310 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1311 |
| 2562 | 1312 static void spatial_compose53i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){ |
| 1313 int y= cs->y; | |
| 1314 DWTELEM *b0= cs->b0; | |
| 1315 DWTELEM *b1= cs->b1; | |
| 1316 DWTELEM *b2= buffer + mirror(y+1, height-1)*stride; | |
| 1317 DWTELEM *b3= buffer + mirror(y+2, height-1)*stride; | |
| 2138 | 1318 |
| 1319 {START_TIMER | |
| 2998 | 1320 if(y+1<(unsigned)height) vertical_compose53iL0(b1, b2, b3, width); |
| 1321 if(y+0<(unsigned)height) vertical_compose53iH0(b0, b1, b2, width); | |
| 2138 | 1322 STOP_TIMER("vertical_compose53i*")} |
| 1323 | |
| 1324 {START_TIMER | |
| 2998 | 1325 if(y-1<(unsigned)height) horizontal_compose53i(b0, width); |
| 1326 if(y+0<(unsigned)height) horizontal_compose53i(b1, width); | |
| 2138 | 1327 STOP_TIMER("horizontal_compose53i")} |
| 1328 | |
| 2562 | 1329 cs->b0 = b2; |
| 1330 cs->b1 = b3; | |
| 1331 cs->y += 2; | |
| 1332 } | |
| 1333 | |
| 1334 static void spatial_compose53i(DWTELEM *buffer, int width, int height, int stride){ | |
| 1335 dwt_compose_t cs; | |
| 1336 spatial_compose53i_init(&cs, buffer, height, stride); | |
| 1337 while(cs.y <= height) | |
| 1338 spatial_compose53i_dy(&cs, buffer, width, height, stride); | |
| 2967 | 1339 } |
| 1340 | |
| 1341 | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1342 void ff_snow_horizontal_compose97i(DWTELEM *b, int width){ |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1343 DWTELEM temp[width]; |
| 2138 | 1344 const int w2= (width+1)>>1; |
| 1345 | |
| 1346 lift (temp , b , b +w2, 1, 1, 1, width, W_DM, W_DO, W_DS, 0, 1); | |
| 1347 lift5(temp+w2, b +w2, temp , 1, 1, 1, width, W_CM, W_CO, W_CS, 1, 1); | |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1348 liftS(b , temp , temp+w2, 2, 1, 1, width, -W_BM, W_BO, W_BS, 0, 1); |
| 2138 | 1349 lift (b+1 , temp+w2, b , 2, 1, 2, width, -W_AM, W_AO, W_AS, 1, 1); |
| 1350 } | |
| 1351 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1352 static void vertical_compose97iH0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1353 int i; |
| 2967 | 1354 |
| 2138 | 1355 for(i=0; i<width; i++){ |
| 1356 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; | |
| 1357 } | |
| 1358 } | |
| 1359 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1360 static void vertical_compose97iH1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1361 int i; |
| 2967 | 1362 |
| 2138 | 1363 for(i=0; i<width; i++){ |
| 1364 #ifdef lift5 | |
| 1365 b1[i] -= (W_CM*(b0[i] + b2[i])+W_CO)>>W_CS; | |
| 1366 #else | |
| 1367 int r= 3*(b0[i] + b2[i]); | |
| 1368 r+= r>>4; | |
| 1369 r+= r>>8; | |
| 1370 b1[i] -= (r+W_CO)>>W_CS; | |
| 1371 #endif | |
| 1372 } | |
| 1373 } | |
| 1374 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1375 static void vertical_compose97iL0(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1376 int i; |
| 2967 | 1377 |
| 2138 | 1378 for(i=0; i<width; i++){ |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1379 #ifdef liftS |
| 2138 | 1380 b1[i] += (W_BM*(b0[i] + b2[i])+W_BO)>>W_BS; |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1381 #else |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1382 b1[i] += (W_BM*(b0[i] + b2[i])+4*b1[i]+W_BO)>>W_BS; |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1383 #endif |
| 2138 | 1384 } |
| 1385 } | |
| 1386 | |
|
2241
c26038875ebc
consistent use of types patch by (D Richard Felker III <dalias at aerifal dot cx>)
michael
parents:
2240
diff
changeset
|
1387 static void vertical_compose97iL1(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, int width){ |
| 2138 | 1388 int i; |
| 2967 | 1389 |
| 2138 | 1390 for(i=0; i<width; i++){ |
| 1391 b1[i] -= (W_DM*(b0[i] + b2[i])+W_DO)>>W_DS; | |
| 1392 } | |
| 1393 } | |
| 1394 | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1395 void ff_snow_vertical_compose97i(DWTELEM *b0, DWTELEM *b1, DWTELEM *b2, DWTELEM *b3, DWTELEM *b4, DWTELEM *b5, int width){ |
| 2592 | 1396 int i; |
| 2967 | 1397 |
| 2592 | 1398 for(i=0; i<width; i++){ |
| 2893 | 1399 #ifndef lift5 |
| 2592 | 1400 int r; |
| 2893 | 1401 #endif |
| 2592 | 1402 b4[i] -= (W_DM*(b3[i] + b5[i])+W_DO)>>W_DS; |
| 1403 #ifdef lift5 | |
| 1404 b3[i] -= (W_CM*(b2[i] + b4[i])+W_CO)>>W_CS; | |
| 1405 #else | |
| 1406 r= 3*(b2[i] + b4[i]); | |
| 1407 r+= r>>4; | |
| 1408 r+= r>>8; | |
| 1409 b3[i] -= (r+W_CO)>>W_CS; | |
| 1410 #endif | |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1411 #ifdef liftS |
| 2592 | 1412 b2[i] += (W_BM*(b1[i] + b3[i])+W_BO)>>W_BS; |
|
2602
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1413 #else |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1414 b2[i] += (W_BM*(b1[i] + b3[i])+4*b2[i]+W_BO)>>W_BS; |
|
5ec55feb6fdd
rescale coefficients during IDWT, that way the lifting steps are much simpler and faster
michael
parents:
2601
diff
changeset
|
1415 #endif |
| 2592 | 1416 b1[i] += (W_AM*(b0[i] + b2[i])+W_AO)>>W_AS; |
| 1417 } | |
| 1418 } | |
| 1419 | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1420 static void spatial_compose97i_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int height, int stride_line){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1421 cs->b0 = slice_buffer_get_line(sb, mirror(-3-1, height-1) * stride_line); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1422 cs->b1 = slice_buffer_get_line(sb, mirror(-3 , height-1) * stride_line); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1423 cs->b2 = slice_buffer_get_line(sb, mirror(-3+1, height-1) * stride_line); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1424 cs->b3 = slice_buffer_get_line(sb, mirror(-3+2, height-1) * stride_line); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1425 cs->y = -3; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1426 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1427 |
| 2562 | 1428 static void spatial_compose97i_init(dwt_compose_t *cs, DWTELEM *buffer, int height, int stride){ |
| 1429 cs->b0 = buffer + mirror(-3-1, height-1)*stride; | |
| 1430 cs->b1 = buffer + mirror(-3 , height-1)*stride; | |
| 1431 cs->b2 = buffer + mirror(-3+1, height-1)*stride; | |
| 1432 cs->b3 = buffer + mirror(-3+2, height-1)*stride; | |
| 1433 cs->y = -3; | |
| 1434 } | |
| 2138 | 1435 |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1436 static void spatial_compose97i_dy_buffered(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1437 int y = cs->y; |
| 2967 | 1438 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1439 DWTELEM *b0= cs->b0; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1440 DWTELEM *b1= cs->b1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1441 DWTELEM *b2= cs->b2; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1442 DWTELEM *b3= cs->b3; |
| 3012 | 1443 DWTELEM *b4= slice_buffer_get_line(sb, mirror(y + 3, height - 1) * stride_line); |
| 1444 DWTELEM *b5= slice_buffer_get_line(sb, mirror(y + 4, height - 1) * stride_line); | |
| 2967 | 1445 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1446 {START_TIMER |
| 2592 | 1447 if(y>0 && y+4<height){ |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1448 dsp->vertical_compose97i(b0, b1, b2, b3, b4, b5, width); |
| 2592 | 1449 }else{ |
| 2998 | 1450 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
| 1451 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
| 1452 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
| 1453 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
| 2592 | 1454 } |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1455 if(width>400){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1456 STOP_TIMER("vertical_compose97i")}} |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1457 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1458 {START_TIMER |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1459 if(y-1<(unsigned)height) dsp->horizontal_compose97i(b0, width); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1460 if(y+0<(unsigned)height) dsp->horizontal_compose97i(b1, width); |
| 3012 | 1461 if(width>400 && y+0<(unsigned)height){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1462 STOP_TIMER("horizontal_compose97i")}} |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1463 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1464 cs->b0=b2; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1465 cs->b1=b3; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1466 cs->b2=b4; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1467 cs->b3=b5; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1468 cs->y += 2; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1469 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1470 |
| 2562 | 1471 static void spatial_compose97i_dy(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride){ |
| 1472 int y = cs->y; | |
| 1473 DWTELEM *b0= cs->b0; | |
| 1474 DWTELEM *b1= cs->b1; | |
| 1475 DWTELEM *b2= cs->b2; | |
| 1476 DWTELEM *b3= cs->b3; | |
| 1477 DWTELEM *b4= buffer + mirror(y+3, height-1)*stride; | |
| 1478 DWTELEM *b5= buffer + mirror(y+4, height-1)*stride; | |
| 2138 | 1479 |
| 1480 {START_TIMER | |
| 2998 | 1481 if(y+3<(unsigned)height) vertical_compose97iL1(b3, b4, b5, width); |
| 1482 if(y+2<(unsigned)height) vertical_compose97iH1(b2, b3, b4, width); | |
| 1483 if(y+1<(unsigned)height) vertical_compose97iL0(b1, b2, b3, width); | |
| 1484 if(y+0<(unsigned)height) vertical_compose97iH0(b0, b1, b2, width); | |
| 2138 | 1485 if(width>400){ |
| 1486 STOP_TIMER("vertical_compose97i")}} | |
| 1487 | |
| 1488 {START_TIMER | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1489 if(y-1<(unsigned)height) ff_snow_horizontal_compose97i(b0, width); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1490 if(y+0<(unsigned)height) ff_snow_horizontal_compose97i(b1, width); |
| 2138 | 1491 if(width>400 && b0 <= b2){ |
| 1492 STOP_TIMER("horizontal_compose97i")}} | |
| 2562 | 1493 |
| 1494 cs->b0=b2; | |
| 1495 cs->b1=b3; | |
| 1496 cs->b2=b4; | |
| 1497 cs->b3=b5; | |
| 1498 cs->y += 2; | |
| 1499 } | |
| 1500 | |
| 1501 static void spatial_compose97i(DWTELEM *buffer, int width, int height, int stride){ | |
| 1502 dwt_compose_t cs; | |
| 1503 spatial_compose97i_init(&cs, buffer, height, stride); | |
| 1504 while(cs.y <= height) | |
| 1505 spatial_compose97i_dy(&cs, buffer, width, height, stride); | |
| 1506 } | |
| 1507 | |
| 3075 | 1508 static void ff_spatial_idwt_buffered_init(dwt_compose_t *cs, slice_buffer * sb, int width, int height, int stride_line, int type, int decomposition_count){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1509 int level; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1510 for(level=decomposition_count-1; level>=0; level--){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1511 switch(type){ |
| 3326 | 1512 case DWT_97: spatial_compose97i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break; |
| 1513 case DWT_53: spatial_compose53i_buffered_init(cs+level, sb, height>>level, stride_line<<level); break; | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1514 /* not slicified yet */ |
| 3326 | 1515 case DWT_X: /*spatial_composeX(buffer, width>>level, height>>level, stride<<level); break;*/ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1516 av_log(NULL, AV_LOG_ERROR, "spatial_composeX neither buffered nor slicified yet.\n"); break; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1517 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1518 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1519 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1520 |
| 3075 | 1521 static void ff_spatial_idwt_init(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
| 2562 | 1522 int level; |
| 1523 for(level=decomposition_count-1; level>=0; level--){ | |
| 1524 switch(type){ | |
| 3326 | 1525 case DWT_97: spatial_compose97i_init(cs+level, buffer, height>>level, stride<<level); break; |
| 1526 case DWT_53: spatial_compose53i_init(cs+level, buffer, height>>level, stride<<level); break; | |
| 2562 | 1527 /* not slicified yet */ |
| 3326 | 1528 case DWT_X: spatial_composeX(buffer, width>>level, height>>level, stride<<level); break; |
| 2562 | 1529 } |
| 1530 } | |
| 1531 } | |
| 1532 | |
| 3075 | 1533 static void ff_spatial_idwt_slice(dwt_compose_t *cs, DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count, int y){ |
| 2562 | 1534 const int support = type==1 ? 3 : 5; |
| 1535 int level; | |
| 1536 if(type==2) return; | |
| 1537 | |
| 1538 for(level=decomposition_count-1; level>=0; level--){ | |
| 1539 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){ | |
| 1540 switch(type){ | |
| 3326 | 1541 case DWT_97: spatial_compose97i_dy(cs+level, buffer, width>>level, height>>level, stride<<level); |
| 2562 | 1542 break; |
| 3326 | 1543 case DWT_53: spatial_compose53i_dy(cs+level, buffer, width>>level, height>>level, stride<<level); |
| 2562 | 1544 break; |
| 3326 | 1545 case DWT_X: break; |
| 2562 | 1546 } |
| 1547 } | |
| 2138 | 1548 } |
| 1549 } | |
| 1550 | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
1551 static void ff_spatial_idwt_buffered_slice(DSPContext *dsp, dwt_compose_t *cs, slice_buffer * slice_buf, int width, int height, int stride_line, int type, int decomposition_count, int y){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1552 const int support = type==1 ? 3 : 5; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1553 int level; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1554 if(type==2) return; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1555 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1556 for(level=decomposition_count-1; level>=0; level--){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1557 while(cs[level].y <= FFMIN((y>>level)+support, height>>level)){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1558 switch(type){ |
| 3326 | 1559 case DWT_97: spatial_compose97i_dy_buffered(dsp, cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1560 break; |
| 3326 | 1561 case DWT_53: spatial_compose53i_dy_buffered(cs+level, slice_buf, width>>level, height>>level, stride_line<<level); |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1562 break; |
| 3326 | 1563 case DWT_X: break; |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1564 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1565 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1566 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1567 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1568 |
| 3075 | 1569 static void ff_spatial_idwt(DWTELEM *buffer, int width, int height, int stride, int type, int decomposition_count){ |
| 2562 | 1570 if(type==2){ |
| 1571 int level; | |
| 1572 for(level=decomposition_count-1; level>=0; level--) | |
| 1573 spatial_composeX (buffer, width>>level, height>>level, stride<<level); | |
| 1574 }else{ | |
| 1575 dwt_compose_t cs[MAX_DECOMPOSITIONS]; | |
| 1576 int y; | |
| 1577 ff_spatial_idwt_init(cs, buffer, width, height, stride, type, decomposition_count); | |
| 1578 for(y=0; y<height; y+=4) | |
| 1579 ff_spatial_idwt_slice(cs, buffer, width, height, stride, type, decomposition_count, y); | |
| 2138 | 1580 } |
| 1581 } | |
| 1582 | |
| 2422 | 1583 static int encode_subband_c0run(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1584 const int w= b->width; |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1585 const int h= b->height; |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1586 int x, y; |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1587 |
| 2138 | 1588 if(1){ |
| 1589 int run=0; | |
| 2149 | 1590 int runs[w*h]; |
| 2138 | 1591 int run_index=0; |
|
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1592 int max_index; |
| 2967 | 1593 |
| 2138 | 1594 for(y=0; y<h; y++){ |
| 1595 for(x=0; x<w; x++){ | |
|
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1596 int v, p=0; |
| 2144 | 1597 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
| 2149 | 1598 v= src[x + y*stride]; |
| 2138 | 1599 |
| 1600 if(y){ | |
| 2149 | 1601 t= src[x + (y-1)*stride]; |
| 2138 | 1602 if(x){ |
| 2149 | 1603 lt= src[x - 1 + (y-1)*stride]; |
| 2138 | 1604 } |
| 1605 if(x + 1 < w){ | |
| 2149 | 1606 rt= src[x + 1 + (y-1)*stride]; |
| 2138 | 1607 } |
| 1608 } | |
| 1609 if(x){ | |
| 2149 | 1610 l= src[x - 1 + y*stride]; |
| 2144 | 1611 /*if(x > 1){ |
| 1612 if(orientation==1) ll= src[y + (x-2)*stride]; | |
| 1613 else ll= src[x - 2 + y*stride]; | |
| 2138 | 1614 }*/ |
| 1615 } | |
|
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1616 if(parent){ |
| 2149 | 1617 int px= x>>1; |
| 1618 int py= y>>1; | |
| 2967 | 1619 if(px<b->parent->width && py<b->parent->height) |
|
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1620 p= parent[px + py*2*stride]; |
|
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1621 } |
|
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1622 if(!(/*ll|*/l|lt|t|rt|p)){ |
| 2138 | 1623 if(v){ |
| 1624 runs[run_index++]= run; | |
| 1625 run=0; | |
| 1626 }else{ | |
| 1627 run++; | |
| 1628 } | |
| 1629 } | |
| 1630 } | |
| 1631 } | |
|
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1632 max_index= run_index; |
| 2138 | 1633 runs[run_index++]= run; |
| 1634 run_index=0; | |
| 1635 run= runs[run_index++]; | |
| 1636 | |
|
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1637 put_symbol2(&s->c, b->state[30], max_index, 0); |
|
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1638 if(run_index <= max_index) |
|
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1639 put_symbol2(&s->c, b->state[1], run, 3); |
| 2967 | 1640 |
| 2138 | 1641 for(y=0; y<h; y++){ |
|
2435
c89ac0e70c66
10l patch by (matthieu castet <castet.matthieu free fr>)
michael
parents:
2422
diff
changeset
|
1642 if(s->c.bytestream_end - s->c.bytestream < w*40){ |
| 2422 | 1643 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); |
| 1644 return -1; | |
| 1645 } | |
| 2138 | 1646 for(x=0; x<w; x++){ |
|
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1647 int v, p=0; |
| 2144 | 1648 int /*ll=0, */l=0, lt=0, t=0, rt=0; |
| 2149 | 1649 v= src[x + y*stride]; |
| 2138 | 1650 |
| 1651 if(y){ | |
| 2149 | 1652 t= src[x + (y-1)*stride]; |
| 2138 | 1653 if(x){ |
| 2149 | 1654 lt= src[x - 1 + (y-1)*stride]; |
| 2138 | 1655 } |
| 1656 if(x + 1 < w){ | |
| 2149 | 1657 rt= src[x + 1 + (y-1)*stride]; |
| 2138 | 1658 } |
| 1659 } | |
| 1660 if(x){ | |
| 2149 | 1661 l= src[x - 1 + y*stride]; |
| 2144 | 1662 /*if(x > 1){ |
| 1663 if(orientation==1) ll= src[y + (x-2)*stride]; | |
| 1664 else ll= src[x - 2 + y*stride]; | |
| 2138 | 1665 }*/ |
| 1666 } | |
|
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1667 if(parent){ |
| 2149 | 1668 int px= x>>1; |
| 1669 int py= y>>1; | |
| 2967 | 1670 if(px<b->parent->width && py<b->parent->height) |
|
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1671 p= parent[px + py*2*stride]; |
|
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1672 } |
|
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1673 if(/*ll|*/l|lt|t|rt|p){ |
| 4001 | 1674 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p)); |
| 2144 | 1675 |
| 2335 | 1676 put_rac(&s->c, &b->state[0][context], !!v); |
| 2138 | 1677 }else{ |
| 1678 if(!run){ | |
| 1679 run= runs[run_index++]; | |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1680 |
|
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1681 if(run_index <= max_index) |
|
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1682 put_symbol2(&s->c, b->state[1], run, 3); |
| 2138 | 1683 assert(v); |
| 1684 }else{ | |
| 1685 run--; | |
| 1686 assert(!v); | |
| 1687 } | |
| 1688 } | |
| 1689 if(v){ | |
| 4001 | 1690 int context= av_log2(/*FFABS(ll) + */3*FFABS(l) + FFABS(lt) + 2*FFABS(t) + FFABS(rt) + FFABS(p)); |
| 1691 int l2= 2*FFABS(l) + (l<0); | |
| 1692 int t2= 2*FFABS(t) + (t<0); | |
| 1693 | |
| 1694 put_symbol2(&s->c, b->state[context + 2], FFABS(v)-1, context-4); | |
| 2596 | 1695 put_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l2&0xFF] + 3*quant3bA[t2&0xFF]], v<0); |
| 2138 | 1696 } |
| 1697 } | |
| 1698 } | |
| 1699 } | |
| 2422 | 1700 return 0; |
| 2138 | 1701 } |
| 1702 | |
| 2967 | 1703 static int encode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){ |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1704 // encode_subband_qtree(s, b, src, parent, stride, orientation); |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1705 // encode_subband_z0run(s, b, src, parent, stride, orientation); |
| 2422 | 1706 return encode_subband_c0run(s, b, src, parent, stride, orientation); |
|
2155
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1707 // encode_subband_dzr(s, b, src, parent, stride, orientation); |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1708 } |
|
274a01d80f4a
various subband encoders (all either worse or complicated so they are commented out)
michael
parents:
2152
diff
changeset
|
1709 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1710 static inline void unpack_coeffs(SnowContext *s, SubBand *b, SubBand * parent, int orientation){ |
| 2138 | 1711 const int w= b->width; |
| 1712 const int h= b->height; | |
| 1713 int x,y; | |
| 2967 | 1714 |
| 2138 | 1715 if(1){ |
|
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1716 int run, runs; |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1717 x_and_coeff *xc= b->x_coeff; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1718 x_and_coeff *prev_xc= NULL; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1719 x_and_coeff *prev2_xc= xc; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1720 x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1721 x_and_coeff *prev_parent_xc= parent_xc; |
| 2138 | 1722 |
|
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1723 runs= get_symbol2(&s->c, b->state[30], 0); |
|
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1724 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); |
|
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1725 else run= INT_MAX; |
|
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1726 |
| 2138 | 1727 for(y=0; y<h; y++){ |
| 2193 | 1728 int v=0; |
| 1729 int lt=0, t=0, rt=0; | |
| 1730 | |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1731 if(y && prev_xc->x == 0){ |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1732 rt= prev_xc->coeff; |
| 2193 | 1733 } |
| 2138 | 1734 for(x=0; x<w; x++){ |
| 2193 | 1735 int p=0; |
| 1736 const int l= v; | |
| 2967 | 1737 |
| 2193 | 1738 lt= t; t= rt; |
| 1739 | |
| 2194 | 1740 if(y){ |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1741 if(prev_xc->x <= x) |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1742 prev_xc++; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1743 if(prev_xc->x == x + 1) |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1744 rt= prev_xc->coeff; |
| 2194 | 1745 else |
| 1746 rt=0; | |
| 1747 } | |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1748 if(parent_xc){ |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1749 if(x>>1 > parent_xc->x){ |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1750 parent_xc++; |
| 2192 | 1751 } |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1752 if(x>>1 == parent_xc->x){ |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1753 p= parent_xc->coeff; |
| 2194 | 1754 } |
|
2148
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1755 } |
|
678be5a8f282
use parent sample to predict significance & magnitude
michael
parents:
2146
diff
changeset
|
1756 if(/*ll|*/l|lt|t|rt|p){ |
| 4001 | 1757 int context= av_log2(/*FFABS(ll) + */3*(l>>1) + (lt>>1) + (t&~1) + (rt>>1) + (p>>1)); |
| 2144 | 1758 |
| 2335 | 1759 v=get_rac(&s->c, &b->state[0][context]); |
| 2605 | 1760 if(v){ |
| 1761 v= 2*(get_symbol2(&s->c, b->state[context + 2], context-4) + 1); | |
| 1762 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3 + quant3bA[l&0xFF] + 3*quant3bA[t&0xFF]]); | |
| 2967 | 1763 |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1764 xc->x=x; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1765 (xc++)->coeff= v; |
| 2605 | 1766 } |
| 2138 | 1767 }else{ |
| 1768 if(!run){ | |
|
2609
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1769 if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); |
|
0f74a379a890
store the number of runs to avoid storing the last run value
michael
parents:
2608
diff
changeset
|
1770 else run= INT_MAX; |
| 2605 | 1771 v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1); |
| 1772 v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]); | |
| 2967 | 1773 |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1774 xc->x=x; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1775 (xc++)->coeff= v; |
| 2138 | 1776 }else{ |
| 2606 | 1777 int max_run; |
| 2138 | 1778 run--; |
| 1779 v=0; | |
| 2191 | 1780 |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1781 if(y) max_run= FFMIN(run, prev_xc->x - x - 2); |
| 2606 | 1782 else max_run= FFMIN(run, w-x-1); |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1783 if(parent_xc) |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1784 max_run= FFMIN(max_run, 2*parent_xc->x - x - 1); |
| 2606 | 1785 x+= max_run; |
| 1786 run-= max_run; | |
| 2138 | 1787 } |
| 1788 } | |
| 2192 | 1789 } |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1790 (xc++)->x= w+1; //end marker |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1791 prev_xc= prev2_xc; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1792 prev2_xc= xc; |
| 2967 | 1793 |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1794 if(parent_xc){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1795 if(y&1){ |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1796 while(parent_xc->x != parent->width+1) |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1797 parent_xc++; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1798 parent_xc++; |
|
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1799 prev_parent_xc= parent_xc; |
| 2192 | 1800 }else{ |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1801 parent_xc= prev_parent_xc; |
| 2138 | 1802 } |
| 1803 } | |
| 1804 } | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1805 |
|
2607
fde7b6fe2aaf
replace complicated pointer dereference + index stuff by pointers in unpack_coeffs()
michael
parents:
2606
diff
changeset
|
1806 (xc++)->x= w+1; //end marker |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1807 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1808 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1809 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1810 static inline void decode_subband_slice_buffered(SnowContext *s, SubBand *b, slice_buffer * sb, int start_y, int h, int save_state[1]){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1811 const int w= b->width; |
| 2893 | 1812 int y; |
| 2600 | 1813 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16); |
| 1814 int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1815 int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1816 int new_index = 0; |
| 2967 | 1817 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1818 START_TIMER |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1819 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1820 if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1821 qadd= 0; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1822 qmul= 1<<QEXPSHIFT; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1823 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1824 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1825 /* If we are on the second or later slice, restore our index. */ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1826 if (start_y != 0) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1827 new_index = save_state[0]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1828 |
| 2967 | 1829 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1830 for(y=start_y; y<h; y++){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1831 int x = 0; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1832 int v; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1833 DWTELEM * line = slice_buffer_get_line(sb, y * b->stride_line + b->buf_y_offset) + b->buf_x_offset; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1834 memset(line, 0, b->width*sizeof(DWTELEM)); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1835 v = b->x_coeff[new_index].coeff; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1836 x = b->x_coeff[new_index++].x; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1837 while(x < w) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1838 { |
| 2596 | 1839 register int t= ( (v>>1)*qmul + qadd)>>QEXPSHIFT; |
| 1840 register int u= -(v&1); | |
| 1841 line[x] = (t^u) - u; | |
| 1842 | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1843 v = b->x_coeff[new_index].coeff; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1844 x = b->x_coeff[new_index++].x; |
| 2138 | 1845 } |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1846 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1847 if(w > 200 && start_y != 0/*level+1 == s->spatial_decomposition_count*/){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1848 STOP_TIMER("decode_subband") |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1849 } |
| 2967 | 1850 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1851 /* Save our variables for the next slice. */ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1852 save_state[0] = new_index; |
| 2967 | 1853 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
1854 return; |
| 2138 | 1855 } |
| 1856 | |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
1857 static void reset_contexts(SnowContext *s){ //FIXME better initial contexts |
| 2138 | 1858 int plane_index, level, orientation; |
| 1859 | |
| 2199 | 1860 for(plane_index=0; plane_index<3; plane_index++){ |
| 2138 | 1861 for(level=0; level<s->spatial_decomposition_count; level++){ |
| 1862 for(orientation=level ? 1:0; orientation<4; orientation++){ | |
| 2335 | 1863 memset(s->plane[plane_index].band[level][orientation].state, MID_STATE, sizeof(s->plane[plane_index].band[level][orientation].state)); |
| 2138 | 1864 } |
| 1865 } | |
| 1866 } | |
| 2335 | 1867 memset(s->header_state, MID_STATE, sizeof(s->header_state)); |
| 1868 memset(s->block_state, MID_STATE, sizeof(s->block_state)); | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1869 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1870 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1871 static int alloc_blocks(SnowContext *s){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1872 int w= -((-s->avctx->width )>>LOG2_MB_SIZE); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1873 int h= -((-s->avctx->height)>>LOG2_MB_SIZE); |
| 2967 | 1874 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1875 s->b_width = w; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1876 s->b_height= h; |
| 2967 | 1877 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1878 s->block= av_mallocz(w * h * sizeof(BlockNode) << (s->block_max_depth*2)); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1879 return 0; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1880 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1881 |
| 2335 | 1882 static inline void copy_rac_state(RangeCoder *d, RangeCoder *s){ |
| 1883 uint8_t *bytestream= d->bytestream; | |
| 1884 uint8_t *bytestream_start= d->bytestream_start; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1885 *d= *s; |
| 2335 | 1886 d->bytestream= bytestream; |
| 1887 d->bytestream_start= bytestream_start; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1888 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1889 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1890 //near copy & paste from dsputil, FIXME |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1891 static int pix_sum(uint8_t * pix, int line_size, int w) |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1892 { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1893 int s, i, j; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1894 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1895 s = 0; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1896 for (i = 0; i < w; i++) { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1897 for (j = 0; j < w; j++) { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1898 s += pix[0]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1899 pix ++; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1900 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1901 pix += line_size - w; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1902 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1903 return s; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1904 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1905 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1906 //near copy & paste from dsputil, FIXME |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1907 static int pix_norm1(uint8_t * pix, int line_size, int w) |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1908 { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1909 int s, i, j; |
| 4179 | 1910 uint32_t *sq = ff_squareTbl + 256; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1911 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1912 s = 0; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1913 for (i = 0; i < w; i++) { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1914 for (j = 0; j < w; j ++) { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1915 s += sq[pix[0]]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1916 pix ++; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1917 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1918 pix += line_size - w; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1919 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1920 return s; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1921 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1922 |
| 3314 | 1923 static inline void set_blocks(SnowContext *s, int level, int x, int y, int l, int cb, int cr, int mx, int my, int ref, int type){ |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1924 const int w= s->b_width << s->block_max_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1925 const int rem_depth= s->block_max_depth - level; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1926 const int index= (x + y*w) << rem_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1927 const int block_w= 1<<rem_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1928 BlockNode block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1929 int i,j; |
| 2967 | 1930 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1931 block.color[0]= l; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1932 block.color[1]= cb; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1933 block.color[2]= cr; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1934 block.mx= mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1935 block.my= my; |
| 3314 | 1936 block.ref= ref; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1937 block.type= type; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1938 block.level= level; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1939 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1940 for(j=0; j<block_w; j++){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1941 for(i=0; i<block_w; i++){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1942 s->block[index + i + j*w]= block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1943 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1944 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1945 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1946 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1947 static inline void init_ref(MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1948 const int offset[3]= { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1949 y*c-> stride + x, |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1950 ((y*c->uvstride + x)>>1), |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1951 ((y*c->uvstride + x)>>1), |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1952 }; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1953 int i; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1954 for(i=0; i<3; i++){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1955 c->src[0][i]= src [i]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1956 c->ref[0][i]= ref [i] + offset[i]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1957 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1958 assert(!ref_index); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1959 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1960 |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1961 static inline void pred_mv(SnowContext *s, int *mx, int *my, int ref, |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1962 BlockNode *left, BlockNode *top, BlockNode *tr){ |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1963 if(s->ref_frames == 1){ |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1964 *mx = mid_pred(left->mx, top->mx, tr->mx); |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1965 *my = mid_pred(left->my, top->my, tr->my); |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1966 }else{ |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1967 const int *scale = scale_mv_ref[ref]; |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1968 *mx = mid_pred(left->mx * scale[left->ref] + 128 >>8, |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1969 top ->mx * scale[top ->ref] + 128 >>8, |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1970 tr ->mx * scale[tr ->ref] + 128 >>8); |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1971 *my = mid_pred(left->my * scale[left->ref] + 128 >>8, |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1972 top ->my * scale[top ->ref] + 128 >>8, |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1973 tr ->my * scale[tr ->ref] + 128 >>8); |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1974 } |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1975 } |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
1976 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1977 //FIXME copy&paste |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1978 #define P_LEFT P[1] |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1979 #define P_TOP P[2] |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1980 #define P_TOPRIGHT P[3] |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1981 #define P_MEDIAN P[4] |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1982 #define P_MV1 P[9] |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1983 #define FLAG_QPEL 1 //must be 1 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1984 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1985 static int encode_q_branch(SnowContext *s, int level, int x, int y){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1986 uint8_t p_buffer[1024]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1987 uint8_t i_buffer[1024]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1988 uint8_t p_state[sizeof(s->block_state)]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1989 uint8_t i_state[sizeof(s->block_state)]; |
| 2335 | 1990 RangeCoder pc, ic; |
| 1991 uint8_t *pbbak= s->c.bytestream; | |
| 1992 uint8_t *pbbak_start= s->c.bytestream_start; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1993 int score, score2, iscore, i_len, p_len, block_s, sum; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1994 const int w= s->b_width << s->block_max_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1995 const int h= s->b_height << s->block_max_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1996 const int rem_depth= s->block_max_depth - level; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1997 const int index= (x + y*w) << rem_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1998 const int block_w= 1<<(LOG2_MB_SIZE - level); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
1999 int trx= (x+1)<<rem_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2000 int try= (y+1)<<rem_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2001 BlockNode *left = x ? &s->block[index-1] : &null_block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2002 BlockNode *top = y ? &s->block[index-w] : &null_block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2003 BlockNode *right = trx<w ? &s->block[index+1] : &null_block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2004 BlockNode *bottom= try<h ? &s->block[index+w] : &null_block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2005 BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2006 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2007 int pl = left->color[0]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2008 int pcb= left->color[1]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2009 int pcr= left->color[2]; |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2010 int pmx, pmy; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2011 int mx=0, my=0; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2012 int l,cr,cb; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2013 const int stride= s->current_picture.linesize[0]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2014 const int uvstride= s->current_picture.linesize[1]; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2015 uint8_t *current_data[3]= { s->input_picture.data[0] + (x + y* stride)*block_w, |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2016 s->input_picture.data[1] + (x + y*uvstride)*block_w/2, |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2017 s->input_picture.data[2] + (x + y*uvstride)*block_w/2}; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2018 int P[10][2]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2019 int16_t last_mv[3][2]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2020 int qpel= !!(s->avctx->flags & CODEC_FLAG_QPEL); //unused |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2021 const int shift= 1+qpel; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2022 MotionEstContext *c= &s->m.me; |
| 3314 | 2023 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); |
| 4001 | 2024 int mx_context= av_log2(2*FFABS(left->mx - top->mx)); |
| 2025 int my_context= av_log2(2*FFABS(left->my - top->my)); | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2026 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
| 3314 | 2027 int ref, best_ref, ref_score, ref_mx, ref_my; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2028 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2029 assert(sizeof(s->block_state) >= 256); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2030 if(s->keyframe){ |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2031 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2032 return 0; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2033 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2034 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2035 // clip predictors / edge ? |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2036 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2037 P_LEFT[0]= left->mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2038 P_LEFT[1]= left->my; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2039 P_TOP [0]= top->mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2040 P_TOP [1]= top->my; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2041 P_TOPRIGHT[0]= tr->mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2042 P_TOPRIGHT[1]= tr->my; |
| 2967 | 2043 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2044 last_mv[0][0]= s->block[index].mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2045 last_mv[0][1]= s->block[index].my; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2046 last_mv[1][0]= right->mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2047 last_mv[1][1]= right->my; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2048 last_mv[2][0]= bottom->mx; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2049 last_mv[2][1]= bottom->my; |
| 2967 | 2050 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2051 s->m.mb_stride=2; |
| 2967 | 2052 s->m.mb_x= |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2053 s->m.mb_y= 0; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2054 s->m.me.skip= 0; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2055 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2056 assert(s->m.me. stride == stride); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2057 assert(s->m.me.uvstride == uvstride); |
| 2967 | 2058 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2059 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2060 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2061 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2062 c->current_mv_penalty= c->mv_penalty[s->m.f_code=1] + MAX_MV; |
| 2967 | 2063 |
| 2206 | 2064 c->xmin = - x*block_w - 16+2; |
| 2065 c->ymin = - y*block_w - 16+2; | |
| 2066 c->xmax = - (x+1)*block_w + (w<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2; | |
| 2067 c->ymax = - (y+1)*block_w + (h<<(LOG2_MB_SIZE - s->block_max_depth)) + 16-2; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2068 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2069 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift); |
| 2967 | 2070 if(P_LEFT[1] > (c->ymax<<shift)) P_LEFT[1] = (c->ymax<<shift); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2071 if(P_TOP[0] > (c->xmax<<shift)) P_TOP[0] = (c->xmax<<shift); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2072 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2073 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2074 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2075 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2076 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2077 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2078 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2079 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2080 if (!y) { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2081 c->pred_x= P_LEFT[0]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2082 c->pred_y= P_LEFT[1]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2083 } else { |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2084 c->pred_x = P_MEDIAN[0]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2085 c->pred_y = P_MEDIAN[1]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2086 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2087 |
| 3314 | 2088 score= INT_MAX; |
| 2089 best_ref= 0; | |
| 2090 for(ref=0; ref<s->ref_frames; ref++){ | |
| 2091 init_ref(c, current_data, s->last_picture[ref].data, NULL, block_w*x, block_w*y, 0); | |
| 2092 | |
| 2093 ref_score= ff_epzs_motion_search(&s->m, &ref_mx, &ref_my, P, 0, /*ref_index*/ 0, last_mv, | |
| 2094 (1<<16)>>shift, level-LOG2_MB_SIZE+4, block_w); | |
| 2095 | |
| 2096 assert(ref_mx >= c->xmin); | |
| 2097 assert(ref_mx <= c->xmax); | |
| 2098 assert(ref_my >= c->ymin); | |
| 2099 assert(ref_my <= c->ymax); | |
| 2100 | |
| 2101 ref_score= s->m.me.sub_motion_search(&s->m, &ref_mx, &ref_my, ref_score, 0, 0, level-LOG2_MB_SIZE+4, block_w); | |
| 2102 ref_score= ff_get_mb_score(&s->m, ref_mx, ref_my, 0, 0, level-LOG2_MB_SIZE+4, block_w, 0); | |
| 2103 ref_score+= 2*av_log2(2*ref)*c->penalty_factor; | |
| 2104 if(s->ref_mvs[ref]){ | |
| 2105 s->ref_mvs[ref][index][0]= ref_mx; | |
| 2106 s->ref_mvs[ref][index][1]= ref_my; | |
| 2107 s->ref_scores[ref][index]= ref_score; | |
| 2108 } | |
| 2109 if(score > ref_score){ | |
| 2110 score= ref_score; | |
| 2111 best_ref= ref; | |
| 2112 mx= ref_mx; | |
| 2113 my= ref_my; | |
| 2114 } | |
| 2115 } | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2116 //FIXME if mb_cmp != SSE then intra cant be compared currently and mb_penalty vs. lambda2 |
| 2967 | 2117 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2118 // subpel search |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2119 pc= s->c; |
| 2335 | 2120 pc.bytestream_start= |
| 2121 pc.bytestream= p_buffer; //FIXME end/start? and at the other stoo | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2122 memcpy(p_state, s->block_state, sizeof(s->block_state)); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2123 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2124 if(level!=s->block_max_depth) |
| 2335 | 2125 put_rac(&pc, &p_state[4 + s_context], 1); |
| 2126 put_rac(&pc, &p_state[1 + left->type + top->type], 0); | |
| 3314 | 2127 if(s->ref_frames > 1) |
| 2128 put_symbol(&pc, &p_state[128 + 1024 + 32*ref_context], best_ref, 0); | |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2129 pred_mv(s, &pmx, &pmy, best_ref, left, top, tr); |
| 3314 | 2130 put_symbol(&pc, &p_state[128 + 32*(mx_context + 16*!!best_ref)], mx - pmx, 1); |
| 2131 put_symbol(&pc, &p_state[128 + 32*(my_context + 16*!!best_ref)], my - pmy, 1); | |
| 2335 | 2132 p_len= pc.bytestream - pc.bytestream_start; |
| 2133 score += (s->lambda2*(p_len*8 | |
| 2134 + (pc.outstanding_count - s->c.outstanding_count)*8 | |
| 2135 + (-av_log2(pc.range) + av_log2(s->c.range)) | |
| 2136 ))>>FF_LAMBDA_SHIFT; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2137 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2138 block_s= block_w*block_w; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2139 sum = pix_sum(current_data[0], stride, block_w); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2140 l= (sum + block_s/2)/block_s; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2141 iscore = pix_norm1(current_data[0], stride, block_w) - 2*l*sum + l*l*block_s; |
| 2967 | 2142 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2143 block_s= block_w*block_w>>2; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2144 sum = pix_sum(current_data[1], uvstride, block_w>>1); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2145 cb= (sum + block_s/2)/block_s; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2146 // iscore += pix_norm1(¤t_mb[1][0], uvstride, block_w>>1) - 2*cb*sum + cb*cb*block_s; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2147 sum = pix_sum(current_data[2], uvstride, block_w>>1); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2148 cr= (sum + block_s/2)/block_s; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2149 // iscore += pix_norm1(¤t_mb[2][0], uvstride, block_w>>1) - 2*cr*sum + cr*cr*block_s; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2150 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2151 ic= s->c; |
| 2335 | 2152 ic.bytestream_start= |
| 2153 ic.bytestream= i_buffer; //FIXME end/start? and at the other stoo | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2154 memcpy(i_state, s->block_state, sizeof(s->block_state)); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2155 if(level!=s->block_max_depth) |
| 2335 | 2156 put_rac(&ic, &i_state[4 + s_context], 1); |
| 2157 put_rac(&ic, &i_state[1 + left->type + top->type], 1); | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2158 put_symbol(&ic, &i_state[32], l-pl , 1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2159 put_symbol(&ic, &i_state[64], cb-pcb, 1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2160 put_symbol(&ic, &i_state[96], cr-pcr, 1); |
| 2335 | 2161 i_len= ic.bytestream - ic.bytestream_start; |
| 2162 iscore += (s->lambda2*(i_len*8 | |
| 2163 + (ic.outstanding_count - s->c.outstanding_count)*8 | |
| 2164 + (-av_log2(ic.range) + av_log2(s->c.range)) | |
| 2165 ))>>FF_LAMBDA_SHIFT; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2166 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2167 // assert(score==256*256*256*64-1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2168 assert(iscore < 255*255*256 + s->lambda2*10); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2169 assert(iscore >= 0); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2170 assert(l>=0 && l<=255); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2171 assert(pl>=0 && pl<=255); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2172 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2173 if(level==0){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2174 int varc= iscore >> 8; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2175 int vard= score >> 8; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2176 if (vard <= 64 || vard < varc) |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2177 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2178 else |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2179 c->scene_change_score+= s->m.qscale; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2180 } |
| 2967 | 2181 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2182 if(level!=s->block_max_depth){ |
| 2335 | 2183 put_rac(&s->c, &s->block_state[4 + s_context], 0); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2184 score2 = encode_q_branch(s, level+1, 2*x+0, 2*y+0); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2185 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+0); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2186 score2+= encode_q_branch(s, level+1, 2*x+0, 2*y+1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2187 score2+= encode_q_branch(s, level+1, 2*x+1, 2*y+1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2188 score2+= s->lambda2>>FF_LAMBDA_SHIFT; //FIXME exact split overhead |
| 2967 | 2189 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2190 if(score2 < score && score2 < iscore) |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2191 return score2; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2192 } |
| 2967 | 2193 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2194 if(iscore < score){ |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2195 pred_mv(s, &pmx, &pmy, 0, left, top, tr); |
| 2335 | 2196 memcpy(pbbak, i_buffer, i_len); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2197 s->c= ic; |
| 2335 | 2198 s->c.bytestream_start= pbbak_start; |
| 2199 s->c.bytestream= pbbak + i_len; | |
| 3314 | 2200 set_blocks(s, level, x, y, l, cb, cr, pmx, pmy, 0, BLOCK_INTRA); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2201 memcpy(s->block_state, i_state, sizeof(s->block_state)); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2202 return iscore; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2203 }else{ |
| 2335 | 2204 memcpy(pbbak, p_buffer, p_len); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2205 s->c= pc; |
| 2335 | 2206 s->c.bytestream_start= pbbak_start; |
| 2207 s->c.bytestream= pbbak + p_len; | |
| 3314 | 2208 set_blocks(s, level, x, y, pl, pcb, pcr, mx, my, best_ref, 0); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2209 memcpy(s->block_state, p_state, sizeof(s->block_state)); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2210 return score; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2211 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2212 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2213 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
2214 static av_always_inline int same_block(BlockNode *a, BlockNode *b){ |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2215 if((a->type&BLOCK_INTRA) && (b->type&BLOCK_INTRA)){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2216 return !((a->color[0] - b->color[0]) | (a->color[1] - b->color[1]) | (a->color[2] - b->color[2])); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2217 }else{ |
| 3314 | 2218 return !((a->mx - b->mx) | (a->my - b->my) | (a->ref - b->ref) | ((a->type ^ b->type)&BLOCK_INTRA)); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2219 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2220 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2221 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2222 static void encode_q_branch2(SnowContext *s, int level, int x, int y){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2223 const int w= s->b_width << s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2224 const int rem_depth= s->block_max_depth - level; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2225 const int index= (x + y*w) << rem_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2226 int trx= (x+1)<<rem_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2227 BlockNode *b= &s->block[index]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2228 BlockNode *left = x ? &s->block[index-1] : &null_block; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2229 BlockNode *top = y ? &s->block[index-w] : &null_block; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2230 BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2231 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2232 int pl = left->color[0]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2233 int pcb= left->color[1]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2234 int pcr= left->color[2]; |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2235 int pmx, pmy; |
| 3314 | 2236 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); |
| 4001 | 2237 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 16*!!b->ref; |
| 2238 int my_context= av_log2(2*FFABS(left->my - top->my)) + 16*!!b->ref; | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2239 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2240 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2241 if(s->keyframe){ |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2242 set_blocks(s, level, x, y, pl, pcb, pcr, 0, 0, 0, BLOCK_INTRA); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2243 return; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2244 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2245 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2246 if(level!=s->block_max_depth){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2247 if(same_block(b,b+1) && same_block(b,b+w) && same_block(b,b+w+1)){ |
|
2995
dfc271b90fe6
4mv + iter ME 10l fix (still not bugfree but better)
michael
parents:
2994
diff
changeset
|
2248 put_rac(&s->c, &s->block_state[4 + s_context], 1); |
|
dfc271b90fe6
4mv + iter ME 10l fix (still not bugfree but better)
michael
parents:
2994
diff
changeset
|
2249 }else{ |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2250 put_rac(&s->c, &s->block_state[4 + s_context], 0); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2251 encode_q_branch2(s, level+1, 2*x+0, 2*y+0); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2252 encode_q_branch2(s, level+1, 2*x+1, 2*y+0); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2253 encode_q_branch2(s, level+1, 2*x+0, 2*y+1); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2254 encode_q_branch2(s, level+1, 2*x+1, 2*y+1); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2255 return; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2256 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2257 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2258 if(b->type & BLOCK_INTRA){ |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2259 pred_mv(s, &pmx, &pmy, 0, left, top, tr); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2260 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 1); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2261 put_symbol(&s->c, &s->block_state[32], b->color[0]-pl , 1); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2262 put_symbol(&s->c, &s->block_state[64], b->color[1]-pcb, 1); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2263 put_symbol(&s->c, &s->block_state[96], b->color[2]-pcr, 1); |
| 3314 | 2264 set_blocks(s, level, x, y, b->color[0], b->color[1], b->color[2], pmx, pmy, 0, BLOCK_INTRA); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2265 }else{ |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2266 pred_mv(s, &pmx, &pmy, b->ref, left, top, tr); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2267 put_rac(&s->c, &s->block_state[1 + (left->type&1) + (top->type&1)], 0); |
| 3314 | 2268 if(s->ref_frames > 1) |
| 2269 put_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], b->ref, 0); | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2270 put_symbol(&s->c, &s->block_state[128 + 32*mx_context], b->mx - pmx, 1); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2271 put_symbol(&s->c, &s->block_state[128 + 32*my_context], b->my - pmy, 1); |
| 3314 | 2272 set_blocks(s, level, x, y, pl, pcb, pcr, b->mx, b->my, b->ref, 0); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2273 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2274 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2275 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2276 static void decode_q_branch(SnowContext *s, int level, int x, int y){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2277 const int w= s->b_width << s->block_max_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2278 const int rem_depth= s->block_max_depth - level; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2279 const int index= (x + y*w) << rem_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2280 int trx= (x+1)<<rem_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2281 BlockNode *left = x ? &s->block[index-1] : &null_block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2282 BlockNode *top = y ? &s->block[index-w] : &null_block; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2283 BlockNode *tl = y && x ? &s->block[index-w-1] : left; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2284 BlockNode *tr = y && trx<w && ((x&1)==0 || level==0) ? &s->block[index-w+(1<<rem_depth)] : tl; //FIXME use lt |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2285 int s_context= 2*left->level + 2*top->level + tl->level + tr->level; |
| 2967 | 2286 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2287 if(s->keyframe){ |
| 3314 | 2288 set_blocks(s, level, x, y, null_block.color[0], null_block.color[1], null_block.color[2], null_block.mx, null_block.my, null_block.ref, BLOCK_INTRA); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2289 return; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2290 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2291 |
| 2335 | 2292 if(level==s->block_max_depth || get_rac(&s->c, &s->block_state[4 + s_context])){ |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2293 int type; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2294 int l = left->color[0]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2295 int cb= left->color[1]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2296 int cr= left->color[2]; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2297 int mx= mid_pred(left->mx, top->mx, tr->mx); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2298 int my= mid_pred(left->my, top->my, tr->my); |
| 3314 | 2299 int ref = 0; |
| 2300 int ref_context= av_log2(2*left->ref) + av_log2(2*top->ref); | |
| 4001 | 2301 int mx_context= av_log2(2*FFABS(left->mx - top->mx)) + 0*av_log2(2*FFABS(tr->mx - top->mx)); |
| 2302 int my_context= av_log2(2*FFABS(left->my - top->my)) + 0*av_log2(2*FFABS(tr->my - top->my)); | |
| 2967 | 2303 |
| 2335 | 2304 type= get_rac(&s->c, &s->block_state[1 + left->type + top->type]) ? BLOCK_INTRA : 0; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2305 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2306 if(type){ |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2307 pred_mv(s, &mx, &my, 0, left, top, tr); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2308 l += get_symbol(&s->c, &s->block_state[32], 1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2309 cb+= get_symbol(&s->c, &s->block_state[64], 1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2310 cr+= get_symbol(&s->c, &s->block_state[96], 1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2311 }else{ |
| 3314 | 2312 if(s->ref_frames > 1) |
| 2313 ref= get_symbol(&s->c, &s->block_state[128 + 1024 + 32*ref_context], 0); | |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2314 pred_mv(s, &mx, &my, ref, left, top, tr); |
| 3314 | 2315 mx+= get_symbol(&s->c, &s->block_state[128 + 32*(mx_context + 16*!!ref)], 1); |
| 2316 my+= get_symbol(&s->c, &s->block_state[128 + 32*(my_context + 16*!!ref)], 1); | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2317 } |
| 3314 | 2318 set_blocks(s, level, x, y, l, cb, cr, mx, my, ref, type); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2319 }else{ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2320 decode_q_branch(s, level+1, 2*x+0, 2*y+0); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2321 decode_q_branch(s, level+1, 2*x+1, 2*y+0); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2322 decode_q_branch(s, level+1, 2*x+0, 2*y+1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2323 decode_q_branch(s, level+1, 2*x+1, 2*y+1); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2324 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2325 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2326 |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
2327 static void encode_blocks(SnowContext *s, int search){ |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2328 int x, y; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2329 int w= s->b_width; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2330 int h= s->b_height; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2331 |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
2332 if(s->avctx->me_method == ME_ITER && !s->keyframe && search) |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2333 iterative_me(s); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2334 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2335 for(y=0; y<h; y++){ |
|
2435
c89ac0e70c66
10l patch by (matthieu castet <castet.matthieu free fr>)
michael
parents:
2422
diff
changeset
|
2336 if(s->c.bytestream_end - s->c.bytestream < w*MB_SIZE*MB_SIZE*3){ //FIXME nicer limit |
| 2422 | 2337 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); |
| 2338 return; | |
| 2339 } | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2340 for(x=0; x<w; x++){ |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
2341 if(s->avctx->me_method == ME_ITER || !search) |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2342 encode_q_branch2(s, 0, x, y); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2343 else |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2344 encode_q_branch (s, 0, x, y); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2345 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2346 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2347 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2348 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2349 static void decode_blocks(SnowContext *s){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2350 int x, y; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2351 int w= s->b_width; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2352 int h= s->b_height; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2353 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2354 for(y=0; y<h; y++){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2355 for(x=0; x<w; x++){ |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2356 decode_q_branch(s, 0, x, y); |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2357 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2358 } |
| 2138 | 2359 } |
| 2360 | |
| 2361 static void mc_block(uint8_t *dst, uint8_t *src, uint8_t *tmp, int stride, int b_w, int b_h, int dx, int dy){ | |
| 2362 int x, y; | |
| 2221 | 2363 START_TIMER |
| 2138 | 2364 for(y=0; y < b_h+5; y++){ |
| 2365 for(x=0; x < b_w; x++){ | |
| 2221 | 2366 int a0= src[x ]; |
| 2367 int a1= src[x + 1]; | |
| 2368 int a2= src[x + 2]; | |
| 2369 int a3= src[x + 3]; | |
| 2370 int a4= src[x + 4]; | |
| 2371 int a5= src[x + 5]; | |
| 2138 | 2372 // int am= 9*(a1+a2) - (a0+a3); |
| 2373 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5); | |
| 2374 // int am= 18*(a2+a3) - 2*(a1+a4); | |
| 2375 // int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3; | |
| 2376 // int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3; | |
| 2377 | |
| 2378 // if(b_w==16) am= 8*(a1+a2); | |
| 2379 | |
|
2610
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2380 if(dx<8) am = (32*a2*( 8-dx) + am* dx + 128)>>8; |
|
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2381 else am = ( am*(16-dx) + 32*a3*(dx-8) + 128)>>8; |
| 2967 | 2382 |
|
2610
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2383 /* FIXME Try increasing tmp buffer to 16 bits and not clipping here. Should give marginally better results. - Robert*/ |
|
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2384 if(am&(~255)) am= ~(am>>31); |
| 2967 | 2385 |
|
2610
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2386 tmp[x] = am; |
| 2138 | 2387 |
| 2388 /* if (dx< 4) tmp[x + y*stride]= (16*a1*( 4-dx) + aL* dx + 32)>>6; | |
| 2389 else if(dx< 8) tmp[x + y*stride]= ( aL*( 8-dx) + am*(dx- 4) + 32)>>6; | |
| 2390 else if(dx<12) tmp[x + y*stride]= ( am*(12-dx) + aR*(dx- 8) + 32)>>6; | |
| 2391 else tmp[x + y*stride]= ( aR*(16-dx) + 16*a2*(dx-12) + 32)>>6;*/ | |
| 2392 } | |
| 2221 | 2393 tmp += stride; |
| 2394 src += stride; | |
| 2138 | 2395 } |
| 2221 | 2396 tmp -= (b_h+5)*stride; |
| 2967 | 2397 |
| 2138 | 2398 for(y=0; y < b_h; y++){ |
| 2399 for(x=0; x < b_w; x++){ | |
| 2221 | 2400 int a0= tmp[x + 0*stride]; |
| 2401 int a1= tmp[x + 1*stride]; | |
| 2402 int a2= tmp[x + 2*stride]; | |
| 2403 int a3= tmp[x + 3*stride]; | |
| 2404 int a4= tmp[x + 4*stride]; | |
| 2405 int a5= tmp[x + 5*stride]; | |
| 2138 | 2406 int am= 20*(a2+a3) - 5*(a1+a4) + (a0+a5); |
| 2407 // int am= 18*(a2+a3) - 2*(a1+a4); | |
| 2408 /* int aL= (-7*a0 + 105*a1 + 35*a2 - 5*a3)>>3; | |
| 2409 int aR= (-7*a3 + 105*a2 + 35*a1 - 5*a0)>>3;*/ | |
| 2967 | 2410 |
| 2138 | 2411 // if(b_w==16) am= 8*(a1+a2); |
| 2412 | |
|
2610
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2413 if(dy<8) am = (32*a2*( 8-dy) + am* dy + 128)>>8; |
|
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2414 else am = ( am*(16-dy) + 32*a3*(dy-8) + 128)>>8; |
|
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2415 |
|
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2416 if(am&(~255)) am= ~(am>>31); |
| 2967 | 2417 |
|
2610
f794026f4551
fix overflow in mc_block() patch by (Yartrebo )yartrebo earthlink net
michael
parents:
2609
diff
changeset
|
2418 dst[x] = am; |
| 2138 | 2419 /* if (dy< 4) tmp[x + y*stride]= (16*a1*( 4-dy) + aL* dy + 32)>>6; |
| 2420 else if(dy< 8) tmp[x + y*stride]= ( aL*( 8-dy) + am*(dy- 4) + 32)>>6; | |
| 2421 else if(dy<12) tmp[x + y*stride]= ( am*(12-dy) + aR*(dy- 8) + 32)>>6; | |
| 2422 else tmp[x + y*stride]= ( aR*(16-dy) + 16*a2*(dy-12) + 32)>>6;*/ | |
| 2423 } | |
| 2221 | 2424 dst += stride; |
| 2425 tmp += stride; | |
| 2138 | 2426 } |
| 2221 | 2427 STOP_TIMER("mc_block") |
| 2138 | 2428 } |
| 2429 | |
| 2430 #define mca(dx,dy,b_w)\ | |
|
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2431 static void mc_block_hpel ## dx ## dy ## b_w(uint8_t *dst, uint8_t *src, int stride, int h){\ |
| 2138 | 2432 uint8_t tmp[stride*(b_w+5)];\ |
| 2433 assert(h==b_w);\ | |
| 2434 mc_block(dst, src-2-2*stride, tmp, stride, b_w, b_w, dx, dy);\ | |
| 2435 } | |
| 2436 | |
| 2437 mca( 0, 0,16) | |
| 2438 mca( 8, 0,16) | |
| 2439 mca( 0, 8,16) | |
| 2440 mca( 8, 8,16) | |
|
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2441 mca( 0, 0,8) |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2442 mca( 8, 0,8) |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2443 mca( 0, 8,8) |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
2444 mca( 8, 8,8) |
| 2138 | 2445 |
| 3314 | 2446 static void pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, int stride, int sx, int sy, int b_w, int b_h, BlockNode *block, int plane_index, int w, int h){ |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2447 if(block->type & BLOCK_INTRA){ |
| 2206 | 2448 int x, y; |
| 3018 | 2449 const int color = block->color[plane_index]; |
| 2450 const int color4= color*0x01010101; | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2451 if(b_w==32){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2452 for(y=0; y < b_h; y++){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2453 *(uint32_t*)&dst[0 + y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2454 *(uint32_t*)&dst[4 + y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2455 *(uint32_t*)&dst[8 + y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2456 *(uint32_t*)&dst[12+ y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2457 *(uint32_t*)&dst[16+ y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2458 *(uint32_t*)&dst[20+ y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2459 *(uint32_t*)&dst[24+ y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2460 *(uint32_t*)&dst[28+ y*stride]= color4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2461 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2462 }else if(b_w==16){ |
| 3018 | 2463 for(y=0; y < b_h; y++){ |
| 2464 *(uint32_t*)&dst[0 + y*stride]= color4; | |
| 2465 *(uint32_t*)&dst[4 + y*stride]= color4; | |
| 2466 *(uint32_t*)&dst[8 + y*stride]= color4; | |
| 2467 *(uint32_t*)&dst[12+ y*stride]= color4; | |
| 2468 } | |
| 2469 }else if(b_w==8){ | |
| 2470 for(y=0; y < b_h; y++){ | |
| 2471 *(uint32_t*)&dst[0 + y*stride]= color4; | |
| 2472 *(uint32_t*)&dst[4 + y*stride]= color4; | |
| 2473 } | |
| 2474 }else if(b_w==4){ | |
| 2475 for(y=0; y < b_h; y++){ | |
| 2476 *(uint32_t*)&dst[0 + y*stride]= color4; | |
| 2477 } | |
| 2478 }else{ | |
| 2479 for(y=0; y < b_h; y++){ | |
| 2480 for(x=0; x < b_w; x++){ | |
| 2481 dst[x + y*stride]= color; | |
| 2482 } | |
| 2138 | 2483 } |
| 2484 } | |
| 2485 }else{ | |
| 3314 | 2486 uint8_t *src= s->last_picture[block->ref].data[plane_index]; |
| 2206 | 2487 const int scale= plane_index ? s->mv_scale : 2*s->mv_scale; |
| 2488 int mx= block->mx*scale; | |
| 2489 int my= block->my*scale; | |
| 2223 | 2490 const int dx= mx&15; |
| 2491 const int dy= my&15; | |
|
3020
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
2492 const int tab_index= 3 - (b_w>>2) + (b_w>>4); |
| 2206 | 2493 sx += (mx>>4) - 2; |
| 2494 sy += (my>>4) - 2; | |
| 2495 src += sx + sy*stride; | |
| 2496 if( (unsigned)sx >= w - b_w - 4 | |
| 2497 || (unsigned)sy >= h - b_h - 4){ | |
| 2498 ff_emulated_edge_mc(tmp + MB_SIZE, src, stride, b_w+5, b_h+5, sx, sy, w, h); | |
| 2499 src= tmp + MB_SIZE; | |
| 2138 | 2500 } |
| 3189 | 2501 // assert(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h); |
| 2502 // assert(!(b_w&(b_w-1))); | |
| 3018 | 2503 assert(b_w>1 && b_h>1); |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2504 assert(tab_index>=0 && tab_index<4 || b_w==32); |
| 3189 | 2505 if((dx&3) || (dy&3) || !(b_w == b_h || 2*b_w == b_h || b_w == 2*b_h) || (b_w&(b_w-1))) |
| 2223 | 2506 mc_block(dst, src, tmp, stride, b_w, b_h, dx, dy); |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2507 else if(b_w==32){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2508 int y; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2509 for(y=0; y<b_h; y+=16){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2510 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 2 + (y+2)*stride,stride); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2511 s->dsp.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 18 + (y+2)*stride,stride); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2512 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2513 }else if(b_w==b_h) |
|
3020
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
2514 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 2 + 2*stride,stride); |
| 3018 | 2515 else if(b_w==2*b_h){ |
|
3020
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
2516 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 2 + 2*stride,stride); |
|
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
2517 s->dsp.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 2 + b_h + 2*stride,stride); |
| 3018 | 2518 }else{ |
| 2519 assert(2*b_w==b_h); | |
|
3020
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
2520 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 2 + 2*stride ,stride); |
|
c75fb0747e74
use h264 MC functions for 2xX Xx2 blocks in snow too
michael
parents:
3018
diff
changeset
|
2521 s->dsp.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 2 + 2*stride+b_w*stride,stride); |
| 3018 | 2522 } |
| 2138 | 2523 } |
| 2524 } | |
| 2525 | |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2526 void ff_snow_inner_add_yblock(uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h, |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2527 int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8){ |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2528 int y, x; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2529 DWTELEM * dst; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2530 for(y=0; y<b_h; y++){ |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2531 //FIXME ugly missue of obmc_stride |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2532 uint8_t *obmc1= obmc + y*obmc_stride; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2533 uint8_t *obmc2= obmc1+ (obmc_stride>>1); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2534 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2535 uint8_t *obmc4= obmc3+ (obmc_stride>>1); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2536 dst = slice_buffer_get_line(sb, src_y + y); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2537 for(x=0; x<b_w; x++){ |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2538 int v= obmc1[x] * block[3][x + y*src_stride] |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2539 +obmc2[x] * block[2][x + y*src_stride] |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2540 +obmc3[x] * block[1][x + y*src_stride] |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2541 +obmc4[x] * block[0][x + y*src_stride]; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2542 |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2543 v <<= 8 - LOG2_OBMC_MAX; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2544 if(FRAC_BITS != 8){ |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2545 v += 1<<(7 - FRAC_BITS); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2546 v >>= 8 - FRAC_BITS; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2547 } |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2548 if(add){ |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2549 v += dst[x + src_x]; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2550 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2551 if(v&(~255)) v= ~(v>>31); |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2552 dst8[x + y*src_stride] = v; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2553 }else{ |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2554 dst[x + src_x] -= v; |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2555 } |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2556 } |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2557 } |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2558 } |
|
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
2559 |
| 2206 | 2560 //FIXME name clenup (b_w, block_w, b_width stuff) |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
2561 static av_always_inline void add_yblock(SnowContext *s, int sliced, slice_buffer *sb, DWTELEM *dst, uint8_t *dst8, const uint8_t *obmc, int src_x, int src_y, int b_w, int b_h, int w, int h, int dst_stride, int src_stride, int obmc_stride, int b_x, int b_y, int add, int offset_dst, int plane_index){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2562 const int b_width = s->b_width << s->block_max_depth; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2563 const int b_height= s->b_height << s->block_max_depth; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2564 const int b_stride= b_width; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2565 BlockNode *lt= &s->block[b_x + b_y*b_stride]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2566 BlockNode *rt= lt+1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2567 BlockNode *lb= lt+b_stride; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2568 BlockNode *rb= lb+1; |
| 2967 | 2569 uint8_t *block[4]; |
| 2842 | 2570 int tmp_step= src_stride >= 7*MB_SIZE ? MB_SIZE : MB_SIZE*src_stride; |
| 2571 uint8_t tmp[src_stride*7*MB_SIZE]; //FIXME align | |
| 2572 uint8_t *ptmp; | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2573 int x,y; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2574 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2575 if(b_x<0){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2576 lt= rt; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2577 lb= rb; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2578 }else if(b_x + 1 >= b_width){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2579 rt= lt; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2580 rb= lb; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2581 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2582 if(b_y<0){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2583 lt= lb; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2584 rt= rb; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2585 }else if(b_y + 1 >= b_height){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2586 lb= lt; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2587 rb= rt; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2588 } |
| 2967 | 2589 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2590 if(src_x<0){ //FIXME merge with prev & always round internal width upto *16 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2591 obmc -= src_x; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2592 b_w += src_x; |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2593 if(!sliced && !offset_dst) |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2594 dst -= src_x; |
| 2206 | 2595 src_x=0; |
| 2596 }else if(src_x + b_w > w){ | |
| 2597 b_w = w - src_x; | |
| 2598 } | |
| 2599 if(src_y<0){ | |
| 2600 obmc -= src_y*obmc_stride; | |
| 2601 b_h += src_y; | |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2602 if(!sliced && !offset_dst) |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2603 dst -= src_y*dst_stride; |
| 2206 | 2604 src_y=0; |
| 2605 }else if(src_y + b_h> h){ | |
| 2606 b_h = h - src_y; | |
| 2607 } | |
| 2967 | 2608 |
| 2206 | 2609 if(b_w<=0 || b_h<=0) return; |
| 2610 | |
| 2842 | 2611 assert(src_stride > 2*MB_SIZE + 5); |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2612 if(!sliced && offset_dst) |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2613 dst += src_x + src_y*dst_stride; |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2614 dst8+= src_x + src_y*src_stride; |
| 2206 | 2615 // src += src_x + src_y*src_stride; |
| 2616 | |
| 2842 | 2617 ptmp= tmp + 3*tmp_step; |
| 2618 block[0]= ptmp; | |
| 2619 ptmp+=tmp_step; | |
| 3314 | 2620 pred_block(s, block[0], tmp, src_stride, src_x, src_y, b_w, b_h, lt, plane_index, w, h); |
| 2206 | 2621 |
| 2622 if(same_block(lt, rt)){ | |
| 2623 block[1]= block[0]; | |
| 2624 }else{ | |
| 2842 | 2625 block[1]= ptmp; |
| 2626 ptmp+=tmp_step; | |
| 3314 | 2627 pred_block(s, block[1], tmp, src_stride, src_x, src_y, b_w, b_h, rt, plane_index, w, h); |
| 2206 | 2628 } |
| 2967 | 2629 |
| 2206 | 2630 if(same_block(lt, lb)){ |
| 2631 block[2]= block[0]; | |
| 2632 }else if(same_block(rt, lb)){ | |
| 2633 block[2]= block[1]; | |
| 2634 }else{ | |
| 2842 | 2635 block[2]= ptmp; |
| 2636 ptmp+=tmp_step; | |
| 3314 | 2637 pred_block(s, block[2], tmp, src_stride, src_x, src_y, b_w, b_h, lb, plane_index, w, h); |
| 2206 | 2638 } |
| 2639 | |
| 2640 if(same_block(lt, rb) ){ | |
| 2641 block[3]= block[0]; | |
| 2642 }else if(same_block(rt, rb)){ | |
| 2643 block[3]= block[1]; | |
| 2644 }else if(same_block(lb, rb)){ | |
| 2645 block[3]= block[2]; | |
| 2646 }else{ | |
| 2842 | 2647 block[3]= ptmp; |
| 3314 | 2648 pred_block(s, block[3], tmp, src_stride, src_x, src_y, b_w, b_h, rb, plane_index, w, h); |
| 2206 | 2649 } |
| 2650 #if 0 | |
| 2651 for(y=0; y<b_h; y++){ | |
| 2652 for(x=0; x<b_w; x++){ | |
| 2653 int v= obmc [x + y*obmc_stride] * block[3][x + y*src_stride] * (256/OBMC_MAX); | |
| 2654 if(add) dst[x + y*dst_stride] += v; | |
| 2655 else dst[x + y*dst_stride] -= v; | |
| 2656 } | |
| 2657 } | |
| 2658 for(y=0; y<b_h; y++){ | |
| 2659 uint8_t *obmc2= obmc + (obmc_stride>>1); | |
| 2660 for(x=0; x<b_w; x++){ | |
| 2661 int v= obmc2[x + y*obmc_stride] * block[2][x + y*src_stride] * (256/OBMC_MAX); | |
| 2662 if(add) dst[x + y*dst_stride] += v; | |
| 2663 else dst[x + y*dst_stride] -= v; | |
| 2664 } | |
| 2665 } | |
| 2666 for(y=0; y<b_h; y++){ | |
| 2667 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
| 2668 for(x=0; x<b_w; x++){ | |
| 2669 int v= obmc3[x + y*obmc_stride] * block[1][x + y*src_stride] * (256/OBMC_MAX); | |
| 2670 if(add) dst[x + y*dst_stride] += v; | |
| 2671 else dst[x + y*dst_stride] -= v; | |
| 2672 } | |
| 2673 } | |
| 2674 for(y=0; y<b_h; y++){ | |
| 2675 uint8_t *obmc3= obmc + obmc_stride*(obmc_stride>>1); | |
| 2676 uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
| 2677 for(x=0; x<b_w; x++){ | |
| 2678 int v= obmc4[x + y*obmc_stride] * block[0][x + y*src_stride] * (256/OBMC_MAX); | |
| 2679 if(add) dst[x + y*dst_stride] += v; | |
| 2680 else dst[x + y*dst_stride] -= v; | |
| 2681 } | |
| 2682 } | |
| 2683 #else | |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2684 if(sliced){ |
|
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2685 START_TIMER |
|
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2686 |
|
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2687 s->dsp.inner_add_yblock(obmc, obmc_stride, block, b_w, b_h, src_x,src_y, src_stride, sb, add, dst8); |
|
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2688 STOP_TIMER("inner_add_yblock") |
|
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2689 }else |
| 2206 | 2690 for(y=0; y<b_h; y++){ |
| 2691 //FIXME ugly missue of obmc_stride | |
| 2692 uint8_t *obmc1= obmc + y*obmc_stride; | |
| 2693 uint8_t *obmc2= obmc1+ (obmc_stride>>1); | |
| 2694 uint8_t *obmc3= obmc1+ obmc_stride*(obmc_stride>>1); | |
| 2695 uint8_t *obmc4= obmc3+ (obmc_stride>>1); | |
| 2696 for(x=0; x<b_w; x++){ | |
| 2697 int v= obmc1[x] * block[3][x + y*src_stride] | |
| 2698 +obmc2[x] * block[2][x + y*src_stride] | |
| 2699 +obmc3[x] * block[1][x + y*src_stride] | |
| 2700 +obmc4[x] * block[0][x + y*src_stride]; | |
| 2967 | 2701 |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2702 v <<= 8 - LOG2_OBMC_MAX; |
| 2246 | 2703 if(FRAC_BITS != 8){ |
| 2704 v += 1<<(7 - FRAC_BITS); | |
| 2705 v >>= 8 - FRAC_BITS; | |
| 2706 } | |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2707 if(add){ |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2708 v += dst[x + y*dst_stride]; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2709 v = (v + (1<<(FRAC_BITS-1))) >> FRAC_BITS; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2710 if(v&(~255)) v= ~(v>>31); |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2711 dst8[x + y*src_stride] = v; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2712 }else{ |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2713 dst[x + y*dst_stride] -= v; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2714 } |
| 2206 | 2715 } |
| 2716 } | |
| 2717 #endif | |
| 2718 } | |
| 2719 | |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
2720 static av_always_inline void predict_slice_buffered(SnowContext *s, slice_buffer * sb, DWTELEM * old_buffer, int plane_index, int add, int mb_y){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2721 Plane *p= &s->plane[plane_index]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2722 const int mb_w= s->b_width << s->block_max_depth; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2723 const int mb_h= s->b_height << s->block_max_depth; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2724 int x, y, mb_x; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2725 int block_size = MB_SIZE >> s->block_max_depth; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2726 int block_w = plane_index ? block_size/2 : block_size; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2727 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2728 int obmc_stride= plane_index ? block_size : 2*block_size; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2729 int ref_stride= s->current_picture.linesize[plane_index]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2730 uint8_t *dst8= s->current_picture.data[plane_index]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2731 int w= p->width; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2732 int h= p->height; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2733 START_TIMER |
| 2967 | 2734 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2735 if(s->keyframe || (s->avctx->debug&512)){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2736 if(mb_y==mb_h) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2737 return; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2738 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2739 if(add){ |
|
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2740 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++) |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2741 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2742 // DWTELEM * line = slice_buffer_get_line(sb, y); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2743 DWTELEM * line = sb->line[y]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2744 for(x=0; x<w; x++) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2745 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2746 // int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2747 int v= line[x] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2748 v >>= FRAC_BITS; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2749 if(v&(~255)) v= ~(v>>31); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2750 dst8[x + y*ref_stride]= v; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2751 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2752 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2753 }else{ |
|
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2754 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++) |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2755 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2756 // DWTELEM * line = slice_buffer_get_line(sb, y); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2757 DWTELEM * line = sb->line[y]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2758 for(x=0; x<w; x++) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2759 { |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2760 line[x] -= 128 << FRAC_BITS; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2761 // buf[x + y*w]-= 128<<FRAC_BITS; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2762 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2763 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2764 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2765 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2766 return; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2767 } |
| 2967 | 2768 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2769 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2770 START_TIMER |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2771 |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2772 add_yblock(s, 1, sb, old_buffer, dst8, obmc, |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2773 block_w*mb_x - block_w/2, |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2774 block_w*mb_y - block_w/2, |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2775 block_w, block_w, |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2776 w, h, |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2777 w, ref_stride, obmc_stride, |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2778 mb_x - 1, mb_y - 1, |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2779 add, 0, plane_index); |
| 2967 | 2780 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2781 STOP_TIMER("add_yblock") |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2782 } |
| 2967 | 2783 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2784 STOP_TIMER("predict_slice") |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2785 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
2786 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
2787 static av_always_inline void predict_slice(SnowContext *s, DWTELEM *buf, int plane_index, int add, int mb_y){ |
| 2138 | 2788 Plane *p= &s->plane[plane_index]; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2789 const int mb_w= s->b_width << s->block_max_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2790 const int mb_h= s->b_height << s->block_max_depth; |
| 2562 | 2791 int x, y, mb_x; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2792 int block_size = MB_SIZE >> s->block_max_depth; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
2793 int block_w = plane_index ? block_size/2 : block_size; |
| 2206 | 2794 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2795 const int obmc_stride= plane_index ? block_size : 2*block_size; |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2796 int ref_stride= s->current_picture.linesize[plane_index]; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2797 uint8_t *dst8= s->current_picture.data[plane_index]; |
| 2138 | 2798 int w= p->width; |
| 2799 int h= p->height; | |
| 2197 | 2800 START_TIMER |
| 2967 | 2801 |
| 2206 | 2802 if(s->keyframe || (s->avctx->debug&512)){ |
| 2562 | 2803 if(mb_y==mb_h) |
| 2804 return; | |
| 2805 | |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2806 if(add){ |
|
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2807 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2808 for(x=0; x<w; x++){ |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2809 int v= buf[x + y*w] + (128<<FRAC_BITS) + (1<<(FRAC_BITS-1)); |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2810 v >>= FRAC_BITS; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2811 if(v&(~255)) v= ~(v>>31); |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2812 dst8[x + y*ref_stride]= v; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2813 } |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2814 } |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2815 }else{ |
|
2604
b7e6c3d31c65
Snow segfault bug in revision 1.43 patch by (Yartrebo /yartrebo earthlink net/)
michael
parents:
2602
diff
changeset
|
2816 for(y=block_w*mb_y; y<FFMIN(h,block_w*(mb_y+1)); y++){ |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2817 for(x=0; x<w; x++){ |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2818 buf[x + y*w]-= 128<<FRAC_BITS; |
|
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
2819 } |
| 2206 | 2820 } |
| 2138 | 2821 } |
| 2206 | 2822 |
| 2823 return; | |
| 2138 | 2824 } |
| 2967 | 2825 |
| 2206 | 2826 for(mb_x=0; mb_x<=mb_w; mb_x++){ |
| 2197 | 2827 START_TIMER |
| 2206 | 2828 |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2829 add_yblock(s, 0, NULL, buf, dst8, obmc, |
| 2206 | 2830 block_w*mb_x - block_w/2, |
| 2138 | 2831 block_w*mb_y - block_w/2, |
| 2206 | 2832 block_w, block_w, |
| 2138 | 2833 w, h, |
| 2206 | 2834 w, ref_stride, obmc_stride, |
| 2835 mb_x - 1, mb_y - 1, | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2836 add, 1, plane_index); |
| 2967 | 2837 |
| 2206 | 2838 STOP_TIMER("add_yblock") |
| 2138 | 2839 } |
| 2967 | 2840 |
| 2562 | 2841 STOP_TIMER("predict_slice") |
| 2842 } | |
| 2843 | |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
2844 static av_always_inline void predict_plane(SnowContext *s, DWTELEM *buf, int plane_index, int add){ |
| 2562 | 2845 const int mb_h= s->b_height << s->block_max_depth; |
| 2846 int mb_y; | |
| 2847 for(mb_y=0; mb_y<=mb_h; mb_y++) | |
| 2848 predict_slice(s, buf, plane_index, add, mb_y); | |
| 2138 | 2849 } |
| 2850 | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2851 static int get_dc(SnowContext *s, int mb_x, int mb_y, int plane_index){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2852 int i, x2, y2; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2853 Plane *p= &s->plane[plane_index]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2854 const int block_size = MB_SIZE >> s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2855 const int block_w = plane_index ? block_size/2 : block_size; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2856 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2857 const int obmc_stride= plane_index ? block_size : 2*block_size; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2858 const int ref_stride= s->current_picture.linesize[plane_index]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2859 uint8_t *src= s-> input_picture.data[plane_index]; |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2860 DWTELEM *dst= (DWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2861 const int b_stride = s->b_width << s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2862 const int w= p->width; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2863 const int h= p->height; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2864 int index= mb_x + mb_y*b_stride; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2865 BlockNode *b= &s->block[index]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2866 BlockNode backup= *b; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2867 int ab=0; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2868 int aa=0; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2869 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2870 b->type|= BLOCK_INTRA; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2871 b->color[plane_index]= 0; |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2872 memset(dst, 0, obmc_stride*obmc_stride*sizeof(DWTELEM)); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2873 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2874 for(i=0; i<4; i++){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2875 int mb_x2= mb_x + (i &1) - 1; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2876 int mb_y2= mb_y + (i>>1) - 1; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2877 int x= block_w*mb_x2 + block_w/2; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2878 int y= block_w*mb_y2 + block_w/2; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2879 |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
2880 add_yblock(s, 0, NULL, dst + ((i&1)+(i>>1)*obmc_stride)*block_w, NULL, obmc, |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2881 x, y, block_w, block_w, w, h, obmc_stride, ref_stride, obmc_stride, mb_x2, mb_y2, 0, 0, plane_index); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2882 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2883 for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_w); y2++){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2884 for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2885 int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_w*mb_y - block_w/2))*obmc_stride; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2886 int obmc_v= obmc[index]; |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2887 int d; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2888 if(y<0) obmc_v += obmc[index + block_w*obmc_stride]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2889 if(x<0) obmc_v += obmc[index + block_w]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2890 if(y+block_w>h) obmc_v += obmc[index - block_w*obmc_stride]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2891 if(x+block_w>w) obmc_v += obmc[index - block_w]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2892 //FIXME precalc this or simplify it somehow else |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2893 |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2894 d = -dst[index] + (1<<(FRAC_BITS-1)); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2895 dst[index] = d; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2896 ab += (src[x2 + y2*ref_stride] - (d>>FRAC_BITS)) * obmc_v; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2897 aa += obmc_v * obmc_v; //FIXME precalclate this |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2898 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2899 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2900 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2901 *b= backup; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2902 |
| 3206 | 2903 return clip(((ab<<LOG2_OBMC_MAX) + aa/2)/aa, 0, 255); //FIXME we shouldnt need cliping |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2904 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2905 |
| 3051 | 2906 static inline int get_block_bits(SnowContext *s, int x, int y, int w){ |
| 2907 const int b_stride = s->b_width << s->block_max_depth; | |
| 2908 const int b_height = s->b_height<< s->block_max_depth; | |
| 2909 int index= x + y*b_stride; | |
| 2910 BlockNode *b = &s->block[index]; | |
| 2911 BlockNode *left = x ? &s->block[index-1] : &null_block; | |
| 2912 BlockNode *top = y ? &s->block[index-b_stride] : &null_block; | |
| 2913 BlockNode *tl = y && x ? &s->block[index-b_stride-1] : left; | |
| 2914 BlockNode *tr = y && x+w<b_stride ? &s->block[index-b_stride+w] : tl; | |
| 2915 int dmx, dmy; | |
| 4001 | 2916 // int mx_context= av_log2(2*FFABS(left->mx - top->mx)); |
| 2917 // int my_context= av_log2(2*FFABS(left->my - top->my)); | |
| 3051 | 2918 |
| 2919 if(x<0 || x>=b_stride || y>=b_height) | |
| 2920 return 0; | |
| 2921 /* | |
| 2922 1 0 0 | |
| 2923 01X 1-2 1 | |
| 2924 001XX 3-6 2-3 | |
| 2925 0001XXX 7-14 4-7 | |
| 2926 00001XXXX 15-30 8-15 | |
| 2927 */ | |
| 2928 //FIXME try accurate rate | |
| 2929 //FIXME intra and inter predictors if surrounding blocks arent the same type | |
| 2930 if(b->type & BLOCK_INTRA){ | |
| 4001 | 2931 return 3+2*( av_log2(2*FFABS(left->color[0] - b->color[0])) |
| 2932 + av_log2(2*FFABS(left->color[1] - b->color[1])) | |
| 2933 + av_log2(2*FFABS(left->color[2] - b->color[2]))); | |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2934 }else{ |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2935 pred_mv(s, &dmx, &dmy, b->ref, left, top, tr); |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2936 dmx-= b->mx; |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2937 dmy-= b->my; |
| 4001 | 2938 return 2*(1 + av_log2(2*FFABS(dmx)) //FIXME kill the 2* can be merged in lambda |
| 2939 + av_log2(2*FFABS(dmy)) | |
| 3314 | 2940 + av_log2(2*b->ref)); |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
2941 } |
| 3051 | 2942 } |
| 2943 | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2944 static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index, const uint8_t *obmc_edged){ |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2945 Plane *p= &s->plane[plane_index]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2946 const int block_size = MB_SIZE >> s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2947 const int block_w = plane_index ? block_size/2 : block_size; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2948 const int obmc_stride= plane_index ? block_size : 2*block_size; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2949 const int ref_stride= s->current_picture.linesize[plane_index]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2950 uint8_t *dst= s->current_picture.data[plane_index]; |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2951 uint8_t *src= s-> input_picture.data[plane_index]; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2952 DWTELEM *pred= (DWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2953 uint8_t cur[ref_stride*2*MB_SIZE]; //FIXME alignment |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2954 uint8_t tmp[ref_stride*(2*MB_SIZE+5)]; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2955 const int b_stride = s->b_width << s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2956 const int b_height = s->b_height<< s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2957 const int w= p->width; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2958 const int h= p->height; |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2959 int distortion; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2960 int rate= 0; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2961 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp); |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2962 int sx= block_w*mb_x - block_w/2; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2963 int sy= block_w*mb_y - block_w/2; |
| 3206 | 2964 int x0= FFMAX(0,-sx); |
| 2965 int y0= FFMAX(0,-sy); | |
| 2966 int x1= FFMIN(block_w*2, w-sx); | |
| 2967 int y1= FFMIN(block_w*2, h-sy); | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2968 int i,x,y; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2969 |
| 3314 | 2970 pred_block(s, cur, tmp, ref_stride, sx, sy, block_w*2, block_w*2, &s->block[mb_x + mb_y*b_stride], plane_index, w, h); |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2971 |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2972 for(y=y0; y<y1; y++){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2973 const uint8_t *obmc1= obmc_edged + y*obmc_stride; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2974 const DWTELEM *pred1 = pred + y*obmc_stride; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2975 uint8_t *cur1 = cur + y*ref_stride; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2976 uint8_t *dst1 = dst + sx + (sy+y)*ref_stride; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2977 for(x=x0; x<x1; x++){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2978 int v = (cur1[x] * obmc1[x]) << (FRAC_BITS - LOG2_OBMC_MAX); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2979 v = (v + pred1[x]) >> FRAC_BITS; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2980 if(v&(~255)) v= ~(v>>31); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2981 dst1[x] = v; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
2982 } |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2983 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
2984 |
| 3206 | 2985 /* copy the regions where obmc[] = (uint8_t)256 */ |
| 2986 if(LOG2_OBMC_MAX == 8 | |
| 2987 && (mb_x == 0 || mb_x == b_stride-1) | |
| 2988 && (mb_y == 0 || mb_y == b_height-1)){ | |
| 2989 if(mb_x == 0) | |
| 2990 x1 = block_w; | |
| 2991 else | |
| 2992 x0 = block_w; | |
| 2993 if(mb_y == 0) | |
| 2994 y1 = block_w; | |
| 2995 else | |
| 2996 y0 = block_w; | |
| 2997 for(y=y0; y<y1; y++) | |
| 2998 memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0); | |
| 2999 } | |
| 3000 | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3001 if(block_w==16){ |
|
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3002 /* FIXME rearrange dsputil to fit 32x32 cmp functions */ |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3003 /* FIXME check alignment of the cmp wavelet vs the encoding wavelet */ |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3004 /* FIXME cmps overlap but don't cover the wavelet's whole support, |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3005 * so improving the score of one block is not strictly guaranteed to |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3006 * improve the score of the whole frame, so iterative motion est |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3007 * doesn't always converge. */ |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3008 if(s->avctx->me_cmp == FF_CMP_W97) |
| 4197 | 3009 distortion = w97_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32); |
|
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3010 else if(s->avctx->me_cmp == FF_CMP_W53) |
| 4197 | 3011 distortion = w53_32_c(&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, 32); |
|
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3012 else{ |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3013 distortion = 0; |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3014 for(i=0; i<4; i++){ |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3015 int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride; |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3016 distortion += s->dsp.me_cmp[0](&s->m, src + off, dst + off, ref_stride, 16); |
|
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3017 } |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3018 } |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3019 }else{ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3020 assert(block_w==8); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3021 distortion = s->dsp.me_cmp[0](&s->m, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3022 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3023 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3024 if(plane_index==0){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3025 for(i=0; i<4; i++){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3026 /* ..RRr |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3027 * .RXx. |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3028 * rxx.. |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3029 */ |
| 3051 | 3030 rate += get_block_bits(s, mb_x + (i&1) - (i>>1), mb_y + (i>>1), 1); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3031 } |
| 3057 | 3032 if(mb_x == b_stride-2) |
| 3033 rate += get_block_bits(s, mb_x + 1, mb_y + 1, 1); | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3034 } |
| 3051 | 3035 return distortion + rate*penalty_factor; |
| 3036 } | |
| 3037 | |
| 3038 static int get_4block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index){ | |
| 3039 int i, y2; | |
| 3040 Plane *p= &s->plane[plane_index]; | |
| 3041 const int block_size = MB_SIZE >> s->block_max_depth; | |
| 3042 const int block_w = plane_index ? block_size/2 : block_size; | |
| 3043 const uint8_t *obmc = plane_index ? obmc_tab[s->block_max_depth+1] : obmc_tab[s->block_max_depth]; | |
| 3044 const int obmc_stride= plane_index ? block_size : 2*block_size; | |
| 3045 const int ref_stride= s->current_picture.linesize[plane_index]; | |
| 3046 uint8_t *dst= s->current_picture.data[plane_index]; | |
| 3047 uint8_t *src= s-> input_picture.data[plane_index]; | |
|
3556
6805c1e5507e
Fix some "'static' is not at beginning of declaration" warnings.
diego
parents:
3338
diff
changeset
|
3048 static const DWTELEM zero_dst[4096]; //FIXME |
| 3051 | 3049 const int b_stride = s->b_width << s->block_max_depth; |
| 3050 const int w= p->width; | |
| 3051 const int h= p->height; | |
| 3052 int distortion= 0; | |
| 3053 int rate= 0; | |
| 3054 const int penalty_factor= get_penalty_factor(s->lambda, s->lambda2, s->avctx->me_cmp); | |
| 3055 | |
| 3056 for(i=0; i<9; i++){ | |
| 3057 int mb_x2= mb_x + (i%3) - 1; | |
| 3058 int mb_y2= mb_y + (i/3) - 1; | |
| 3059 int x= block_w*mb_x2 + block_w/2; | |
| 3060 int y= block_w*mb_y2 + block_w/2; | |
| 3061 | |
|
3662
fc714e9a5419
snow cosmetics: merge the sliced and non-sliced versions of add_yblock
lorenm
parents:
3661
diff
changeset
|
3062 add_yblock(s, 0, NULL, zero_dst, dst, obmc, |
| 3051 | 3063 x, y, block_w, block_w, w, h, /*dst_stride*/0, ref_stride, obmc_stride, mb_x2, mb_y2, 1, 1, plane_index); |
| 3064 | |
| 3065 //FIXME find a cleaner/simpler way to skip the outside stuff | |
| 3066 for(y2= y; y2<0; y2++) | |
| 3067 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
| 3068 for(y2= h; y2<y+block_w; y2++) | |
| 3069 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, block_w); | |
| 3070 if(x<0){ | |
| 3071 for(y2= y; y2<y+block_w; y2++) | |
| 3072 memcpy(dst + x + y2*ref_stride, src + x + y2*ref_stride, -x); | |
| 3073 } | |
| 3074 if(x+block_w > w){ | |
| 3075 for(y2= y; y2<y+block_w; y2++) | |
| 3076 memcpy(dst + w + y2*ref_stride, src + w + y2*ref_stride, x+block_w - w); | |
| 3077 } | |
| 3078 | |
| 3079 assert(block_w== 8 || block_w==16); | |
| 3080 distortion += s->dsp.me_cmp[block_w==8](&s->m, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_w); | |
| 3081 } | |
| 3082 | |
| 3083 if(plane_index==0){ | |
| 3084 BlockNode *b= &s->block[mb_x+mb_y*b_stride]; | |
| 3085 int merged= same_block(b,b+1) && same_block(b,b+b_stride) && same_block(b,b+b_stride+1); | |
| 3086 | |
| 3087 /* ..RRRr | |
| 3088 * .RXXx. | |
| 3089 * .RXXx. | |
| 3090 * rxxx. | |
| 3091 */ | |
| 3092 if(merged) | |
| 3093 rate = get_block_bits(s, mb_x, mb_y, 2); | |
| 3094 for(i=merged?4:0; i<9; i++){ | |
| 3095 static const int dxy[9][2] = {{0,0},{1,0},{0,1},{1,1},{2,0},{2,1},{-1,2},{0,2},{1,2}}; | |
| 3096 rate += get_block_bits(s, mb_x + dxy[i][0], mb_y + dxy[i][1], 1); | |
| 3097 } | |
| 3098 } | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3099 return distortion + rate*penalty_factor; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3100 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3101 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3102 static av_always_inline int check_block(SnowContext *s, int mb_x, int mb_y, int p[3], int intra, const uint8_t *obmc_edged, int *best_rd){ |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3103 const int b_stride= s->b_width << s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3104 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3105 BlockNode backup= *block; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3106 int rd, index, value; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3107 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3108 assert(mb_x>=0 && mb_y>=0); |
| 2994 | 3109 assert(mb_x<b_stride); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3110 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3111 if(intra){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3112 block->color[0] = p[0]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3113 block->color[1] = p[1]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3114 block->color[2] = p[2]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3115 block->type |= BLOCK_INTRA; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3116 }else{ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3117 index= (p[0] + 31*p[1]) & (ME_CACHE_SIZE-1); |
| 3314 | 3118 value= s->me_cache_generation + (p[0]>>10) + (p[1]<<6) + (block->ref<<12); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3119 if(s->me_cache[index] == value) |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3120 return 0; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3121 s->me_cache[index]= value; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3122 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3123 block->mx= p[0]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3124 block->my= p[1]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3125 block->type &= ~BLOCK_INTRA; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3126 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3127 |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3128 rd= get_block_rd(s, mb_x, mb_y, 0, obmc_edged); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3129 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3130 //FIXME chroma |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3131 if(rd < *best_rd){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3132 *best_rd= rd; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3133 return 1; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3134 }else{ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3135 *block= backup; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3136 return 0; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3137 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3138 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3139 |
|
2999
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3140 /* special case for int[2] args we discard afterward, fixes compilation prob with gcc 2.95 */ |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3141 static av_always_inline int check_block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, const uint8_t *obmc_edged, int *best_rd){ |
|
2999
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3142 int p[2] = {p0, p1}; |
| 3197 | 3143 return check_block(s, mb_x, mb_y, p, 0, obmc_edged, best_rd); |
|
2999
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3144 } |
|
bc83e7a080a5
this fixes compilation with gcc 2.95 which seems to not like array casting... special case inline of check_block which makes the array and passes it
mmu_man
parents:
2998
diff
changeset
|
3145 |
|
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4197
diff
changeset
|
3146 static av_always_inline int check_4block_inter(SnowContext *s, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd){ |
| 3051 | 3147 const int b_stride= s->b_width << s->block_max_depth; |
| 3148 BlockNode *block= &s->block[mb_x + mb_y * b_stride]; | |
| 3149 BlockNode backup[4]= {block[0], block[1], block[b_stride], block[b_stride+1]}; | |
| 3150 int rd, index, value; | |
| 3151 | |
| 3152 assert(mb_x>=0 && mb_y>=0); | |
| 3153 assert(mb_x<b_stride); | |
| 3154 assert(((mb_x|mb_y)&1) == 0); | |
| 3155 | |
| 3156 index= (p0 + 31*p1) & (ME_CACHE_SIZE-1); | |
| 3314 | 3157 value= s->me_cache_generation + (p0>>10) + (p1<<6) + (block->ref<<12); |
| 3051 | 3158 if(s->me_cache[index] == value) |
| 3159 return 0; | |
| 3160 s->me_cache[index]= value; | |
| 3161 | |
| 3162 block->mx= p0; | |
| 3163 block->my= p1; | |
| 3314 | 3164 block->ref= ref; |
| 3051 | 3165 block->type &= ~BLOCK_INTRA; |
| 3166 block[1]= block[b_stride]= block[b_stride+1]= *block; | |
| 3167 | |
| 3168 rd= get_4block_rd(s, mb_x, mb_y, 0); | |
| 3169 | |
| 3170 //FIXME chroma | |
| 3171 if(rd < *best_rd){ | |
| 3172 *best_rd= rd; | |
| 3173 return 1; | |
| 3174 }else{ | |
| 3175 block[0]= backup[0]; | |
| 3176 block[1]= backup[1]; | |
| 3177 block[b_stride]= backup[2]; | |
| 3178 block[b_stride+1]= backup[3]; | |
| 3179 return 0; | |
| 3180 } | |
| 3181 } | |
| 3182 | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3183 static void iterative_me(SnowContext *s){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3184 int pass, mb_x, mb_y; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3185 const int b_width = s->b_width << s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3186 const int b_height= s->b_height << s->block_max_depth; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3187 const int b_stride= b_width; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3188 int color[3]; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3189 |
|
3194
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3190 { |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3191 RangeCoder r = s->c; |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3192 uint8_t state[sizeof(s->block_state)]; |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3193 memcpy(state, s->block_state, sizeof(s->block_state)); |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3194 for(mb_y= 0; mb_y<s->b_height; mb_y++) |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3195 for(mb_x= 0; mb_x<s->b_width; mb_x++) |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3196 encode_q_branch(s, 0, mb_x, mb_y); |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3197 s->c = r; |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3198 memcpy(s->block_state, state, sizeof(s->block_state)); |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3199 } |
|
c30e9bcbb716
seed iterative_me with mvs from conventional search.
lorenm
parents:
3193
diff
changeset
|
3200 |
|
3323
87c54a3f8d19
Snow: fix subband weighting in wavelet cmp functions. use 32x32 cmp in iterative motion estimation.
lorenm
parents:
3322
diff
changeset
|
3201 for(pass=0; pass<25; pass++){ |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3202 int change= 0; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3203 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3204 for(mb_y= 0; mb_y<b_height; mb_y++){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3205 for(mb_x= 0; mb_x<b_width; mb_x++){ |
| 3314 | 3206 int dia_change, i, j, ref; |
| 3207 int best_rd= INT_MAX, ref_rd; | |
| 3208 BlockNode backup, ref_b; | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3209 const int index= mb_x + mb_y * b_stride; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3210 BlockNode *block= &s->block[index]; |
| 3324 | 3211 BlockNode *tb = mb_y ? &s->block[index-b_stride ] : NULL; |
| 3212 BlockNode *lb = mb_x ? &s->block[index -1] : NULL; | |
| 3213 BlockNode *rb = mb_x+1<b_width ? &s->block[index +1] : NULL; | |
| 3214 BlockNode *bb = mb_y+1<b_height ? &s->block[index+b_stride ] : NULL; | |
| 3215 BlockNode *tlb= mb_x && mb_y ? &s->block[index-b_stride-1] : NULL; | |
| 3216 BlockNode *trb= mb_x+1<b_width && mb_y ? &s->block[index-b_stride+1] : NULL; | |
| 3217 BlockNode *blb= mb_x && mb_y+1<b_height ? &s->block[index+b_stride-1] : NULL; | |
| 3218 BlockNode *brb= mb_x+1<b_width && mb_y+1<b_height ? &s->block[index+b_stride+1] : NULL; | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3219 const int b_w= (MB_SIZE >> s->block_max_depth); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3220 uint8_t obmc_edged[b_w*2][b_w*2]; |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3221 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3222 if(pass && (block->type & BLOCK_OPT)) |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3223 continue; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3224 block->type |= BLOCK_OPT; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3225 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3226 backup= *block; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3227 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3228 if(!s->me_cache_generation) |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3229 memset(s->me_cache, 0, sizeof(s->me_cache)); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3230 s->me_cache_generation += 1<<22; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3231 |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3232 //FIXME precalc |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3233 { |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3234 int x, y; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3235 memcpy(obmc_edged, obmc_tab[s->block_max_depth], b_w*b_w*4); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3236 if(mb_x==0) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3237 for(y=0; y<b_w*2; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3238 memset(obmc_edged[y], obmc_edged[y][0] + obmc_edged[y][b_w-1], b_w); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3239 if(mb_x==b_stride-1) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3240 for(y=0; y<b_w*2; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3241 memset(obmc_edged[y]+b_w, obmc_edged[y][b_w] + obmc_edged[y][b_w*2-1], b_w); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3242 if(mb_y==0){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3243 for(x=0; x<b_w*2; x++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3244 obmc_edged[0][x] += obmc_edged[b_w-1][x]; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3245 for(y=1; y<b_w; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3246 memcpy(obmc_edged[y], obmc_edged[0], b_w*2); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3247 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3248 if(mb_y==b_height-1){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3249 for(x=0; x<b_w*2; x++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3250 obmc_edged[b_w*2-1][x] += obmc_edged[b_w][x]; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3251 for(y=b_w; y<b_w*2-1; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3252 memcpy(obmc_edged[y], obmc_edged[b_w*2-1], b_w*2); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3253 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3254 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3255 |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3256 //skip stuff outside the picture |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3257 if(mb_x==0 || mb_y==0 || mb_x==b_width-1 || mb_y==b_height-1) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3258 { |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3259 uint8_t *src= s-> input_picture.data[0]; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3260 uint8_t *dst= s->current_picture.data[0]; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3261 const int stride= s->current_picture.linesize[0]; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3262 const int block_w= MB_SIZE >> s->block_max_depth; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3263 const int sx= block_w*mb_x - block_w/2; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3264 const int sy= block_w*mb_y - block_w/2; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3265 const int w= s->plane[0].width; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3266 const int h= s->plane[0].height; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3267 int y; |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3268 |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3269 for(y=sy; y<0; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3270 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3271 for(y=h; y<sy+block_w*2; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3272 memcpy(dst + sx + y*stride, src + sx + y*stride, block_w*2); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3273 if(sx<0){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3274 for(y=sy; y<sy+block_w*2; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3275 memcpy(dst + sx + y*stride, src + sx + y*stride, -sx); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3276 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3277 if(sx+block_w*2 > w){ |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3278 for(y=sy; y<sy+block_w*2; y++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3279 memcpy(dst + w + y*stride, src + w + y*stride, sx+block_w*2 - w); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3280 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3281 } |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3282 |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3283 // intra(black) = neighbors' contribution to the current block |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3284 for(i=0; i<3; i++) |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3285 color[i]= get_dc(s, mb_x, mb_y, i); |
|
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3286 |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3287 // get previous score (cant be cached due to OBMC) |
| 3057 | 3288 if(pass > 0 && (block->type&BLOCK_INTRA)){ |
| 3289 int color0[3]= {block->color[0], block->color[1], block->color[2]}; | |
| 3290 check_block(s, mb_x, mb_y, color0, 1, *obmc_edged, &best_rd); | |
| 3291 }else | |
| 3197 | 3292 check_block_inter(s, mb_x, mb_y, block->mx, block->my, *obmc_edged, &best_rd); |
| 3293 | |
| 3314 | 3294 ref_b= *block; |
| 3295 ref_rd= best_rd; | |
| 3296 for(ref=0; ref < s->ref_frames; ref++){ | |
| 3297 int16_t (*mvr)[2]= &s->ref_mvs[ref][index]; | |
| 3298 if(s->ref_scores[ref][index] > s->ref_scores[ref_b.ref][index]*3/2) //FIXME tune threshold | |
| 3299 continue; | |
| 3300 block->ref= ref; | |
| 3301 best_rd= INT_MAX; | |
| 3302 | |
| 3303 check_block_inter(s, mb_x, mb_y, mvr[0][0], mvr[0][1], *obmc_edged, &best_rd); | |
| 3304 check_block_inter(s, mb_x, mb_y, 0, 0, *obmc_edged, &best_rd); | |
| 3324 | 3305 if(tb) |
| 3314 | 3306 check_block_inter(s, mb_x, mb_y, mvr[-b_stride][0], mvr[-b_stride][1], *obmc_edged, &best_rd); |
| 3324 | 3307 if(lb) |
| 3314 | 3308 check_block_inter(s, mb_x, mb_y, mvr[-1][0], mvr[-1][1], *obmc_edged, &best_rd); |
| 3324 | 3309 if(rb) |
| 3314 | 3310 check_block_inter(s, mb_x, mb_y, mvr[1][0], mvr[1][1], *obmc_edged, &best_rd); |
| 3324 | 3311 if(bb) |
| 3314 | 3312 check_block_inter(s, mb_x, mb_y, mvr[b_stride][0], mvr[b_stride][1], *obmc_edged, &best_rd); |
| 3313 | |
| 3314 /* fullpel ME */ | |
| 3315 //FIXME avoid subpel interpol / round to nearest integer | |
| 3316 do{ | |
| 3317 dia_change=0; | |
| 3318 for(i=0; i<FFMAX(s->avctx->dia_size, 1); i++){ | |
| 3319 for(j=0; j<i; j++){ | |
| 3320 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
| 3321 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
| 3322 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+4*(i-j), block->my-(4*j), *obmc_edged, &best_rd); | |
| 3323 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx-4*(i-j), block->my+(4*j), *obmc_edged, &best_rd); | |
| 3324 } | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3325 } |
| 3314 | 3326 }while(dia_change); |
| 3327 /* subpel ME */ | |
| 3328 do{ | |
| 3329 static const int square[8][2]= {{+1, 0},{-1, 0},{ 0,+1},{ 0,-1},{+1,+1},{-1,-1},{+1,-1},{-1,+1},}; | |
| 3330 dia_change=0; | |
| 3331 for(i=0; i<8; i++) | |
| 3332 dia_change |= check_block_inter(s, mb_x, mb_y, block->mx+square[i][0], block->my+square[i][1], *obmc_edged, &best_rd); | |
| 3333 }while(dia_change); | |
| 3334 //FIXME or try the standard 2 pass qpel or similar | |
| 3335 | |
| 3336 mvr[0][0]= block->mx; | |
| 3337 mvr[0][1]= block->my; | |
| 3338 if(ref_rd > best_rd){ | |
| 3339 ref_rd= best_rd; | |
| 3340 ref_b= *block; | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3341 } |
| 3314 | 3342 } |
| 3343 best_rd= ref_rd; | |
| 3344 *block= ref_b; | |
| 2998 | 3345 #if 1 |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3346 check_block(s, mb_x, mb_y, color, 1, *obmc_edged, &best_rd); |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3347 //FIXME RD style color selection |
| 2998 | 3348 #endif |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3349 if(!same_block(block, &backup)){ |
| 3324 | 3350 if(tb ) tb ->type &= ~BLOCK_OPT; |
| 3351 if(lb ) lb ->type &= ~BLOCK_OPT; | |
| 3352 if(rb ) rb ->type &= ~BLOCK_OPT; | |
| 3353 if(bb ) bb ->type &= ~BLOCK_OPT; | |
| 3354 if(tlb) tlb->type &= ~BLOCK_OPT; | |
| 3355 if(trb) trb->type &= ~BLOCK_OPT; | |
| 3356 if(blb) blb->type &= ~BLOCK_OPT; | |
| 3357 if(brb) brb->type &= ~BLOCK_OPT; | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3358 change ++; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3359 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3360 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3361 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3362 av_log(NULL, AV_LOG_ERROR, "pass:%d changed:%d\n", pass, change); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3363 if(!change) |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3364 break; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3365 } |
| 3051 | 3366 |
| 3367 if(s->block_max_depth == 1){ | |
| 3368 int change= 0; | |
| 3369 for(mb_y= 0; mb_y<b_height; mb_y+=2){ | |
| 3370 for(mb_x= 0; mb_x<b_width; mb_x+=2){ | |
| 3324 | 3371 int i; |
| 3051 | 3372 int best_rd, init_rd; |
| 3373 const int index= mb_x + mb_y * b_stride; | |
| 3374 BlockNode *b[4]; | |
| 3375 | |
| 3376 b[0]= &s->block[index]; | |
| 3377 b[1]= b[0]+1; | |
| 3378 b[2]= b[0]+b_stride; | |
| 3379 b[3]= b[2]+1; | |
| 3380 if(same_block(b[0], b[1]) && | |
| 3381 same_block(b[0], b[2]) && | |
| 3382 same_block(b[0], b[3])) | |
| 3383 continue; | |
| 3384 | |
| 3385 if(!s->me_cache_generation) | |
| 3386 memset(s->me_cache, 0, sizeof(s->me_cache)); | |
| 3387 s->me_cache_generation += 1<<22; | |
| 3388 | |
| 3389 init_rd= best_rd= get_4block_rd(s, mb_x, mb_y, 0); | |
| 3390 | |
| 3314 | 3391 //FIXME more multiref search? |
| 3051 | 3392 check_4block_inter(s, mb_x, mb_y, |
| 3393 (b[0]->mx + b[1]->mx + b[2]->mx + b[3]->mx + 2) >> 2, | |
| 3314 | 3394 (b[0]->my + b[1]->my + b[2]->my + b[3]->my + 2) >> 2, 0, &best_rd); |
| 3051 | 3395 |
| 3396 for(i=0; i<4; i++) | |
| 3397 if(!(b[i]->type&BLOCK_INTRA)) | |
| 3314 | 3398 check_4block_inter(s, mb_x, mb_y, b[i]->mx, b[i]->my, b[i]->ref, &best_rd); |
| 3051 | 3399 |
| 3400 if(init_rd != best_rd) | |
| 3401 change++; | |
| 3402 } | |
| 3403 } | |
| 3404 av_log(NULL, AV_LOG_ERROR, "pass:4mv changed:%d\n", change*4); | |
| 3405 } | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3406 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
3407 |
| 2138 | 3408 static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int bias){ |
| 3409 const int level= b->level; | |
| 3410 const int w= b->width; | |
| 3411 const int h= b->height; | |
| 2600 | 3412 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16); |
| 3413 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); | |
| 2150 | 3414 int x,y, thres1, thres2; |
| 2893 | 3415 // START_TIMER |
| 2138 | 3416 |
| 2161 | 3417 if(s->qlog == LOSSLESS_QLOG) return; |
| 2967 | 3418 |
| 2138 | 3419 bias= bias ? 0 : (3*qmul)>>3; |
| 2150 | 3420 thres1= ((qmul - bias)>>QEXPSHIFT) - 1; |
| 3421 thres2= 2*thres1; | |
| 2967 | 3422 |
| 2138 | 3423 if(!bias){ |
| 3424 for(y=0; y<h; y++){ | |
| 3425 for(x=0; x<w; x++){ | |
| 2150 | 3426 int i= src[x + y*stride]; |
| 2967 | 3427 |
| 2150 | 3428 if((unsigned)(i+thres1) > thres2){ |
| 3429 if(i>=0){ | |
| 3430 i<<= QEXPSHIFT; | |
| 3431 i/= qmul; //FIXME optimize | |
| 3432 src[x + y*stride]= i; | |
| 3433 }else{ | |
| 3434 i= -i; | |
| 3435 i<<= QEXPSHIFT; | |
| 3436 i/= qmul; //FIXME optimize | |
| 3437 src[x + y*stride]= -i; | |
| 3438 } | |
| 3439 }else | |
| 3440 src[x + y*stride]= 0; | |
| 2138 | 3441 } |
| 3442 } | |
| 3443 }else{ | |
| 3444 for(y=0; y<h; y++){ | |
| 3445 for(x=0; x<w; x++){ | |
| 2967 | 3446 int i= src[x + y*stride]; |
| 3447 | |
| 2150 | 3448 if((unsigned)(i+thres1) > thres2){ |
| 3449 if(i>=0){ | |
| 3450 i<<= QEXPSHIFT; | |
| 3451 i= (i + bias) / qmul; //FIXME optimize | |
| 3452 src[x + y*stride]= i; | |
| 3453 }else{ | |
| 3454 i= -i; | |
| 3455 i<<= QEXPSHIFT; | |
| 3456 i= (i + bias) / qmul; //FIXME optimize | |
| 3457 src[x + y*stride]= -i; | |
| 3458 } | |
| 3459 }else | |
| 3460 src[x + y*stride]= 0; | |
| 2138 | 3461 } |
| 3462 } | |
| 3463 } | |
| 2150 | 3464 if(level+1 == s->spatial_decomposition_count){ |
| 3465 // STOP_TIMER("quantize") | |
| 3466 } | |
| 2138 | 3467 } |
| 3468 | |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
3469 static void dequantize_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int start_y, int end_y){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3470 const int w= b->width; |
| 2600 | 3471 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16); |
| 3472 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3473 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3474 int x,y; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3475 START_TIMER |
| 2967 | 3476 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3477 if(s->qlog == LOSSLESS_QLOG) return; |
| 2967 | 3478 |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
3479 for(y=start_y; y<end_y; y++){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3480 // DWTELEM * line = slice_buffer_get_line_from_address(sb, src + (y * stride)); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3481 DWTELEM * line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3482 for(x=0; x<w; x++){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3483 int i= line[x]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3484 if(i<0){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3485 line[x]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3486 }else if(i>0){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3487 line[x]= (( i*qmul + qadd)>>(QEXPSHIFT)); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3488 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3489 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3490 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3491 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3492 STOP_TIMER("dquant") |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3493 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3494 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3495 |
| 2138 | 3496 static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){ |
| 3497 const int w= b->width; | |
| 3498 const int h= b->height; | |
| 2600 | 3499 const int qlog= clip(s->qlog + b->qlog, 0, QROOT*16); |
| 3500 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); | |
| 2138 | 3501 const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; |
| 3502 int x,y; | |
| 2195 | 3503 START_TIMER |
| 2967 | 3504 |
| 2161 | 3505 if(s->qlog == LOSSLESS_QLOG) return; |
| 2967 | 3506 |
| 2138 | 3507 for(y=0; y<h; y++){ |
| 3508 for(x=0; x<w; x++){ | |
| 3509 int i= src[x + y*stride]; | |
| 3510 if(i<0){ | |
| 3511 src[x + y*stride]= -((-i*qmul + qadd)>>(QEXPSHIFT)); //FIXME try different bias | |
| 3512 }else if(i>0){ | |
| 3513 src[x + y*stride]= (( i*qmul + qadd)>>(QEXPSHIFT)); | |
| 3514 } | |
| 3515 } | |
| 3516 } | |
| 2195 | 3517 if(w > 200 /*level+1 == s->spatial_decomposition_count*/){ |
| 3518 STOP_TIMER("dquant") | |
| 3519 } | |
| 2138 | 3520 } |
| 3521 | |
| 3522 static void decorrelate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){ | |
| 3523 const int w= b->width; | |
| 3524 const int h= b->height; | |
| 3525 int x,y; | |
| 2967 | 3526 |
| 2138 | 3527 for(y=h-1; y>=0; y--){ |
| 3528 for(x=w-1; x>=0; x--){ | |
| 3529 int i= x + y*stride; | |
| 2967 | 3530 |
| 2138 | 3531 if(x){ |
| 3532 if(use_median){ | |
| 3533 if(y && x+1<w) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
| 3534 else src[i] -= src[i - 1]; | |
| 3535 }else{ | |
| 3536 if(y) src[i] -= mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
| 3537 else src[i] -= src[i - 1]; | |
| 3538 } | |
| 3539 }else{ | |
| 3540 if(y) src[i] -= src[i - stride]; | |
| 3541 } | |
| 3542 } | |
| 3543 } | |
| 3544 } | |
| 3545 | |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
3546 static void correlate_slice_buffered(SnowContext *s, slice_buffer * sb, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median, int start_y, int end_y){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3547 const int w= b->width; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3548 int x,y; |
| 2967 | 3549 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3550 // START_TIMER |
| 2967 | 3551 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3552 DWTELEM * line; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3553 DWTELEM * prev; |
| 2967 | 3554 |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
3555 if (start_y != 0) |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
3556 line = slice_buffer_get_line(sb, ((start_y - 1) * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
| 2967 | 3557 |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
3558 for(y=start_y; y<end_y; y++){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3559 prev = line; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3560 // line = slice_buffer_get_line_from_address(sb, src + (y * stride)); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3561 line = slice_buffer_get_line(sb, (y * b->stride_line) + b->buf_y_offset) + b->buf_x_offset; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3562 for(x=0; x<w; x++){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3563 if(x){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3564 if(use_median){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3565 if(y && x+1<w) line[x] += mid_pred(line[x - 1], prev[x], prev[x + 1]); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3566 else line[x] += line[x - 1]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3567 }else{ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3568 if(y) line[x] += mid_pred(line[x - 1], prev[x], line[x - 1] + prev[x] - prev[x - 1]); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3569 else line[x] += line[x - 1]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3570 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3571 }else{ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3572 if(y) line[x] += prev[x]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3573 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3574 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3575 } |
| 2967 | 3576 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3577 // STOP_TIMER("correlate") |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3578 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3579 |
| 2138 | 3580 static void correlate(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int inverse, int use_median){ |
| 3581 const int w= b->width; | |
| 3582 const int h= b->height; | |
| 3583 int x,y; | |
| 2967 | 3584 |
| 2138 | 3585 for(y=0; y<h; y++){ |
| 3586 for(x=0; x<w; x++){ | |
| 3587 int i= x + y*stride; | |
| 2967 | 3588 |
| 2138 | 3589 if(x){ |
| 3590 if(use_median){ | |
| 3591 if(y && x+1<w) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - stride + 1]); | |
| 3592 else src[i] += src[i - 1]; | |
| 3593 }else{ | |
| 3594 if(y) src[i] += mid_pred(src[i - 1], src[i - stride], src[i - 1] + src[i - stride] - src[i - 1 - stride]); | |
| 3595 else src[i] += src[i - 1]; | |
| 3596 } | |
| 3597 }else{ | |
| 3598 if(y) src[i] += src[i - stride]; | |
| 3599 } | |
| 3600 } | |
| 3601 } | |
| 3602 } | |
| 3603 | |
| 3604 static void encode_header(SnowContext *s){ | |
| 3605 int plane_index, level, orientation; | |
| 2967 | 3606 uint8_t kstate[32]; |
| 3607 | |
| 3608 memset(kstate, MID_STATE, sizeof(kstate)); | |
| 2138 | 3609 |
| 2335 | 3610 put_rac(&s->c, kstate, s->keyframe); |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3611 if(s->keyframe || s->always_reset){ |
| 2199 | 3612 reset_contexts(s); |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3613 s->last_spatial_decomposition_type= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3614 s->last_qlog= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3615 s->last_qbias= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3616 s->last_mv_scale= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3617 s->last_block_max_depth= 0; |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3618 } |
| 2138 | 3619 if(s->keyframe){ |
| 3620 put_symbol(&s->c, s->header_state, s->version, 0); | |
| 2335 | 3621 put_rac(&s->c, s->header_state, s->always_reset); |
| 2138 | 3622 put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0); |
| 3623 put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0); | |
| 3624 put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); | |
| 3625 put_symbol(&s->c, s->header_state, s->colorspace_type, 0); | |
| 3626 put_symbol(&s->c, s->header_state, s->chroma_h_shift, 0); | |
| 3627 put_symbol(&s->c, s->header_state, s->chroma_v_shift, 0); | |
| 2335 | 3628 put_rac(&s->c, s->header_state, s->spatial_scalability); |
| 3629 // put_rac(&s->c, s->header_state, s->rate_scalability); | |
| 3314 | 3630 put_symbol(&s->c, s->header_state, s->max_ref_frames-1, 0); |
| 2138 | 3631 |
| 3632 for(plane_index=0; plane_index<2; plane_index++){ | |
| 3633 for(level=0; level<s->spatial_decomposition_count; level++){ | |
| 3634 for(orientation=level ? 1:0; orientation<4; orientation++){ | |
| 3635 if(orientation==2) continue; | |
| 3636 put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1); | |
| 3637 } | |
| 3638 } | |
| 3639 } | |
| 3640 } | |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3641 put_symbol(&s->c, s->header_state, s->spatial_decomposition_type - s->last_spatial_decomposition_type, 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3642 put_symbol(&s->c, s->header_state, s->qlog - s->last_qlog , 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3643 put_symbol(&s->c, s->header_state, s->mv_scale - s->last_mv_scale, 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3644 put_symbol(&s->c, s->header_state, s->qbias - s->last_qbias , 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3645 put_symbol(&s->c, s->header_state, s->block_max_depth - s->last_block_max_depth, 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3646 |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3647 s->last_spatial_decomposition_type= s->spatial_decomposition_type; |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3648 s->last_qlog = s->qlog; |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3649 s->last_qbias = s->qbias; |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3650 s->last_mv_scale = s->mv_scale; |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3651 s->last_block_max_depth = s->block_max_depth; |
| 2138 | 3652 } |
| 3653 | |
| 3654 static int decode_header(SnowContext *s){ | |
| 3655 int plane_index, level, orientation; | |
| 2335 | 3656 uint8_t kstate[32]; |
| 2138 | 3657 |
| 2967 | 3658 memset(kstate, MID_STATE, sizeof(kstate)); |
| 2335 | 3659 |
| 3660 s->keyframe= get_rac(&s->c, kstate); | |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3661 if(s->keyframe || s->always_reset){ |
| 2199 | 3662 reset_contexts(s); |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3663 s->spatial_decomposition_type= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3664 s->qlog= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3665 s->qbias= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3666 s->mv_scale= |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3667 s->block_max_depth= 0; |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3668 } |
| 2138 | 3669 if(s->keyframe){ |
| 3670 s->version= get_symbol(&s->c, s->header_state, 0); | |
| 3671 if(s->version>0){ | |
| 3672 av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version); | |
| 3673 return -1; | |
| 3674 } | |
| 2335 | 3675 s->always_reset= get_rac(&s->c, s->header_state); |
| 2138 | 3676 s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0); |
| 3677 s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0); | |
| 3678 s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0); | |
| 3679 s->colorspace_type= get_symbol(&s->c, s->header_state, 0); | |
| 3680 s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0); | |
| 3681 s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0); | |
| 2335 | 3682 s->spatial_scalability= get_rac(&s->c, s->header_state); |
| 3683 // s->rate_scalability= get_rac(&s->c, s->header_state); | |
| 3314 | 3684 s->max_ref_frames= get_symbol(&s->c, s->header_state, 0)+1; |
| 2138 | 3685 |
| 3686 for(plane_index=0; plane_index<3; plane_index++){ | |
| 3687 for(level=0; level<s->spatial_decomposition_count; level++){ | |
| 3688 for(orientation=level ? 1:0; orientation<4; orientation++){ | |
| 3689 int q; | |
| 3690 if (plane_index==2) q= s->plane[1].band[level][orientation].qlog; | |
| 3691 else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog; | |
| 3692 else q= get_symbol(&s->c, s->header_state, 1); | |
| 3693 s->plane[plane_index].band[level][orientation].qlog= q; | |
| 3694 } | |
| 3695 } | |
| 3696 } | |
| 3697 } | |
| 2967 | 3698 |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3699 s->spatial_decomposition_type+= get_symbol(&s->c, s->header_state, 1); |
| 2138 | 3700 if(s->spatial_decomposition_type > 2){ |
| 3701 av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type); | |
| 3702 return -1; | |
| 3703 } | |
| 2967 | 3704 |
|
4331
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3705 s->qlog += get_symbol(&s->c, s->header_state, 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3706 s->mv_scale += get_symbol(&s->c, s->header_state, 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3707 s->qbias += get_symbol(&s->c, s->header_state, 1); |
|
e571dfe677be
store a few values in the header as difference to the last
michael
parents:
4283
diff
changeset
|
3708 s->block_max_depth+= get_symbol(&s->c, s->header_state, 1); |
|
3303
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3206
diff
changeset
|
3709 if(s->block_max_depth > 1 || s->block_max_depth < 0){ |
| 2952 | 3710 av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth); |
| 3711 s->block_max_depth= 0; | |
| 3712 return -1; | |
| 3713 } | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3714 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3715 return 0; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3716 } |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3717 |
| 3075 | 3718 static void init_qexp(void){ |
| 2600 | 3719 int i; |
| 3720 double v=128; | |
| 3721 | |
| 3722 for(i=0; i<QROOT; i++){ | |
| 3723 qexp[i]= lrintf(v); | |
| 2967 | 3724 v *= pow(2, 1.0 / QROOT); |
| 2600 | 3725 } |
| 3726 } | |
| 3727 | |
| 2138 | 3728 static int common_init(AVCodecContext *avctx){ |
| 3729 SnowContext *s = avctx->priv_data; | |
| 3730 int width, height; | |
| 3731 int level, orientation, plane_index, dec; | |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3732 int i, j; |
| 2138 | 3733 |
| 3734 s->avctx= avctx; | |
| 2967 | 3735 |
| 2138 | 3736 dsputil_init(&s->dsp, avctx); |
| 3737 | |
| 3738 #define mcf(dx,dy)\ | |
| 3739 s->dsp.put_qpel_pixels_tab [0][dy+dx/4]=\ | |
| 3740 s->dsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\ | |
|
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3741 s->dsp.put_h264_qpel_pixels_tab[0][dy+dx/4];\ |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3742 s->dsp.put_qpel_pixels_tab [1][dy+dx/4]=\ |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3743 s->dsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\ |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3744 s->dsp.put_h264_qpel_pixels_tab[1][dy+dx/4]; |
| 2138 | 3745 |
| 3746 mcf( 0, 0) | |
| 3747 mcf( 4, 0) | |
| 3748 mcf( 8, 0) | |
| 3749 mcf(12, 0) | |
| 3750 mcf( 0, 4) | |
| 3751 mcf( 4, 4) | |
| 3752 mcf( 8, 4) | |
| 3753 mcf(12, 4) | |
| 3754 mcf( 0, 8) | |
| 3755 mcf( 4, 8) | |
| 3756 mcf( 8, 8) | |
| 3757 mcf(12, 8) | |
| 3758 mcf( 0,12) | |
| 3759 mcf( 4,12) | |
| 3760 mcf( 8,12) | |
| 3761 mcf(12,12) | |
| 3762 | |
| 3763 #define mcfh(dx,dy)\ | |
| 3764 s->dsp.put_pixels_tab [0][dy/4+dx/8]=\ | |
| 3765 s->dsp.put_no_rnd_pixels_tab[0][dy/4+dx/8]=\ | |
|
2224
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3766 mc_block_hpel ## dx ## dy ## 16;\ |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3767 s->dsp.put_pixels_tab [1][dy/4+dx/8]=\ |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3768 s->dsp.put_no_rnd_pixels_tab[1][dy/4+dx/8]=\ |
|
11d54cb7ac4e
100l (forgot to set the 8x8 mc functions, so ME did use the mpeg ones ...)
michael
parents:
2223
diff
changeset
|
3769 mc_block_hpel ## dx ## dy ## 8; |
| 2138 | 3770 |
| 3771 mcfh(0, 0) | |
| 3772 mcfh(8, 0) | |
| 3773 mcfh(0, 8) | |
| 3774 mcfh(8, 8) | |
| 2600 | 3775 |
| 3776 if(!qexp[0]) | |
| 3777 init_qexp(); | |
| 3778 | |
| 2138 | 3779 dec= s->spatial_decomposition_count= 5; |
| 3780 s->spatial_decomposition_type= avctx->prediction_method; //FIXME add decorrelator type r transform_type | |
| 2967 | 3781 |
| 2138 | 3782 s->chroma_h_shift= 1; //FIXME XXX |
| 3783 s->chroma_v_shift= 1; | |
| 2967 | 3784 |
| 2138 | 3785 // dec += FFMAX(s->chroma_h_shift, s->chroma_v_shift); |
| 2967 | 3786 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3787 width= s->avctx->width; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3788 height= s->avctx->height; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3789 |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3790 s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM)); |
| 2967 | 3791 |
| 2138 | 3792 s->mv_scale= (s->avctx->flags & CODEC_FLAG_QPEL) ? 2 : 4; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3793 s->block_max_depth= (s->avctx->flags & CODEC_FLAG_4MV) ? 1 : 0; |
| 2967 | 3794 |
| 3795 for(plane_index=0; plane_index<3; plane_index++){ | |
| 2138 | 3796 int w= s->avctx->width; |
| 3797 int h= s->avctx->height; | |
| 3798 | |
| 3799 if(plane_index){ | |
| 3800 w>>= s->chroma_h_shift; | |
| 3801 h>>= s->chroma_v_shift; | |
| 3802 } | |
| 3803 s->plane[plane_index].width = w; | |
| 3804 s->plane[plane_index].height= h; | |
| 2160 | 3805 //av_log(NULL, AV_LOG_DEBUG, "%d %d\n", w, h); |
| 2138 | 3806 for(level=s->spatial_decomposition_count-1; level>=0; level--){ |
| 3807 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
| 3808 SubBand *b= &s->plane[plane_index].band[level][orientation]; | |
| 2967 | 3809 |
| 2138 | 3810 b->buf= s->spatial_dwt_buffer; |
| 3811 b->level= level; | |
| 3812 b->stride= s->plane[plane_index].width << (s->spatial_decomposition_count - level); | |
| 3813 b->width = (w + !(orientation&1))>>1; | |
| 3814 b->height= (h + !(orientation>1))>>1; | |
| 2967 | 3815 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3816 b->stride_line = 1 << (s->spatial_decomposition_count - level); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3817 b->buf_x_offset = 0; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3818 b->buf_y_offset = 0; |
| 2967 | 3819 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3820 if(orientation&1){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3821 b->buf += (w+1)>>1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3822 b->buf_x_offset = (w+1)>>1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3823 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3824 if(orientation>1){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3825 b->buf += b->stride>>1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3826 b->buf_y_offset = b->stride_line >> 1; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3827 } |
| 2967 | 3828 |
| 2138 | 3829 if(level) |
| 3830 b->parent= &s->plane[plane_index].band[level-1][orientation]; | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
3831 b->x_coeff=av_mallocz(((b->width+1) * b->height+1)*sizeof(x_and_coeff)); |
| 2138 | 3832 } |
| 3833 w= (w+1)>>1; | |
| 3834 h= (h+1)>>1; | |
| 3835 } | |
| 3836 } | |
| 2967 | 3837 |
|
3325
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3838 for(i=0; i<MAX_REF_FRAMES; i++) |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3839 for(j=0; j<MAX_REF_FRAMES; j++) |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3840 scale_mv_ref[i][j] = 256*(i+1)/(j+1); |
|
c2a017de6bea
Snow: scale predicted mv based on which reference frame the neighbors used.
lorenm
parents:
3324
diff
changeset
|
3841 |
| 2138 | 3842 reset_contexts(s); |
| 2967 | 3843 /* |
| 2138 | 3844 width= s->width= avctx->width; |
| 3845 height= s->height= avctx->height; | |
| 2967 | 3846 |
| 2138 | 3847 assert(width && height); |
| 3848 */ | |
| 3849 s->avctx->get_buffer(s->avctx, &s->mconly_picture); | |
| 2967 | 3850 |
| 2138 | 3851 return 0; |
| 3852 } | |
| 3853 | |
|
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
3854 static int qscale2qlog(int qscale){ |
|
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
3855 return rint(QROOT*log(qscale / (float)FF_QP2LAMBDA)/log(2)) |
|
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
3856 + 61*QROOT/8; //<64 >60 |
|
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
3857 } |
|
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
3858 |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
3859 static int ratecontrol_1pass(SnowContext *s, AVFrame *pict) |
| 3313 | 3860 { |
| 3861 /* estimate the frame's complexity as a sum of weighted dwt coefs. | |
| 3862 * FIXME we know exact mv bits at this point, | |
| 3863 * but ratecontrol isn't set up to include them. */ | |
| 3864 uint32_t coef_sum= 0; | |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
3865 int level, orientation, delta_qlog; |
| 3313 | 3866 |
| 3867 for(level=0; level<s->spatial_decomposition_count; level++){ | |
| 3868 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
| 3869 SubBand *b= &s->plane[0].band[level][orientation]; | |
| 3870 DWTELEM *buf= b->buf; | |
| 3871 const int w= b->width; | |
| 3872 const int h= b->height; | |
| 3873 const int stride= b->stride; | |
| 3874 const int qlog= clip(2*QROOT + b->qlog, 0, QROOT*16); | |
| 3875 const int qmul= qexp[qlog&(QROOT-1)]<<(qlog>>QSHIFT); | |
| 3876 const int qdiv= (1<<16)/qmul; | |
| 3877 int x, y; | |
| 3878 if(orientation==0) | |
| 3879 decorrelate(s, b, buf, stride, 1, 0); | |
| 3880 for(y=0; y<h; y++) | |
| 3881 for(x=0; x<w; x++) | |
| 3882 coef_sum+= abs(buf[x+y*stride]) * qdiv >> 16; | |
| 3883 if(orientation==0) | |
| 3884 correlate(s, b, buf, stride, 1, 0); | |
| 3885 } | |
| 3886 } | |
| 3887 | |
| 3888 /* ugly, ratecontrol just takes a sqrt again */ | |
| 3889 coef_sum = (uint64_t)coef_sum * coef_sum >> 16; | |
| 3890 assert(coef_sum < INT_MAX); | |
| 3891 | |
| 3892 if(pict->pict_type == I_TYPE){ | |
| 3893 s->m.current_picture.mb_var_sum= coef_sum; | |
| 3894 s->m.current_picture.mc_mb_var_sum= 0; | |
| 3895 }else{ | |
| 3896 s->m.current_picture.mc_mb_var_sum= coef_sum; | |
| 3897 s->m.current_picture.mb_var_sum= 0; | |
| 3898 } | |
| 3899 | |
| 3900 pict->quality= ff_rate_estimate_qscale(&s->m, 1); | |
| 3766 | 3901 if (pict->quality < 0) |
|
4011
5bce97c30a69
-1 is a valid return value in ratecontrol_1pass() -> 100l for takis
michael
parents:
4001
diff
changeset
|
3902 return INT_MIN; |
| 3313 | 3903 s->lambda= pict->quality * 3/2; |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
3904 delta_qlog= qscale2qlog(pict->quality) - s->qlog; |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
3905 s->qlog+= delta_qlog; |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
3906 return delta_qlog; |
| 3313 | 3907 } |
| 2138 | 3908 |
| 3909 static void calculate_vissual_weight(SnowContext *s, Plane *p){ | |
| 3910 int width = p->width; | |
| 3911 int height= p->height; | |
| 2198 | 3912 int level, orientation, x, y; |
| 2138 | 3913 |
| 3914 for(level=0; level<s->spatial_decomposition_count; level++){ | |
| 3915 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
| 3916 SubBand *b= &p->band[level][orientation]; | |
| 3917 DWTELEM *buf= b->buf; | |
| 3918 int64_t error=0; | |
| 2967 | 3919 |
| 2138 | 3920 memset(s->spatial_dwt_buffer, 0, sizeof(int)*width*height); |
| 3921 buf[b->width/2 + b->height/2*b->stride]= 256*256; | |
| 2164 | 3922 ff_spatial_idwt(s->spatial_dwt_buffer, width, height, width, s->spatial_decomposition_type, s->spatial_decomposition_count); |
| 2138 | 3923 for(y=0; y<height; y++){ |
| 3924 for(x=0; x<width; x++){ | |
| 3925 int64_t d= s->spatial_dwt_buffer[x + y*width]; | |
| 3926 error += d*d; | |
| 3927 } | |
| 3928 } | |
| 3929 | |
| 3930 b->qlog= (int)(log(352256.0/sqrt(error)) / log(pow(2.0, 1.0/QROOT))+0.5); | |
| 2164 | 3931 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", level, orientation, b->qlog/*, sqrt(error)*/); |
| 2138 | 3932 } |
| 3933 } | |
| 3934 } | |
| 3935 | |
| 3936 static int encode_init(AVCodecContext *avctx) | |
| 3937 { | |
| 3938 SnowContext *s = avctx->priv_data; | |
| 2198 | 3939 int plane_index; |
| 2138 | 3940 |
|
2658
d1609cfeb1d0
#defines for strict_std_compliance and split between inofficial extensions and non standarized things
michael
parents:
2635
diff
changeset
|
3941 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2610
diff
changeset
|
3942 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it may not be decodable with future versions!!!\n" |
|
2658
d1609cfeb1d0
#defines for strict_std_compliance and split between inofficial extensions and non standarized things
michael
parents:
2635
diff
changeset
|
3943 "use vstrict=-2 / -strict -2 to use it anyway\n"); |
| 2151 | 3944 return -1; |
| 3945 } | |
| 2967 | 3946 |
|
3327
955096780e7c
Snow: don't try to encode lossless with 9/7 wavelet, because it isn't lossless.
lorenm
parents:
3326
diff
changeset
|
3947 if(avctx->prediction_method == DWT_97 |
|
955096780e7c
Snow: don't try to encode lossless with 9/7 wavelet, because it isn't lossless.
lorenm
parents:
3326
diff
changeset
|
3948 && (avctx->flags & CODEC_FLAG_QSCALE) |
|
955096780e7c
Snow: don't try to encode lossless with 9/7 wavelet, because it isn't lossless.
lorenm
parents:
3326
diff
changeset
|
3949 && avctx->global_quality == 0){ |
|
955096780e7c
Snow: don't try to encode lossless with 9/7 wavelet, because it isn't lossless.
lorenm
parents:
3326
diff
changeset
|
3950 av_log(avctx, AV_LOG_ERROR, "the 9/7 wavelet is incompatible with lossless mode\n"); |
|
955096780e7c
Snow: don't try to encode lossless with 9/7 wavelet, because it isn't lossless.
lorenm
parents:
3326
diff
changeset
|
3951 return -1; |
|
955096780e7c
Snow: don't try to encode lossless with 9/7 wavelet, because it isn't lossless.
lorenm
parents:
3326
diff
changeset
|
3952 } |
|
955096780e7c
Snow: don't try to encode lossless with 9/7 wavelet, because it isn't lossless.
lorenm
parents:
3326
diff
changeset
|
3953 |
| 2138 | 3954 common_init(avctx); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
3955 alloc_blocks(s); |
| 2967 | 3956 |
| 2138 | 3957 s->version=0; |
| 2967 | 3958 |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3959 s->m.avctx = avctx; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3960 s->m.flags = avctx->flags; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3961 s->m.bit_rate= avctx->bit_rate; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3962 |
| 2138 | 3963 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t)); |
| 3964 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); | |
| 3965 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t)); | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
3966 s->m.obmc_scratchpad= av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t)); |
| 2138 | 3967 h263_encode_init(&s->m); //mv_penalty |
| 3968 | |
| 3314 | 3969 s->max_ref_frames = FFMAX(FFMIN(avctx->refs, MAX_REF_FRAMES), 1); |
| 3970 | |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3971 if(avctx->flags&CODEC_FLAG_PASS1){ |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3972 if(!avctx->stats_out) |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3973 avctx->stats_out = av_mallocz(256); |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3974 } |
|
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
3975 if((avctx->flags&CODEC_FLAG_PASS2) || !(avctx->flags&CODEC_FLAG_QSCALE)){ |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3976 if(ff_rate_control_init(&s->m) < 0) |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3977 return -1; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3978 } |
| 3313 | 3979 s->pass1_rc= !(avctx->flags & (CODEC_FLAG_QSCALE|CODEC_FLAG_PASS2)); |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
3980 |
| 2138 | 3981 for(plane_index=0; plane_index<3; plane_index++){ |
| 3982 calculate_vissual_weight(s, &s->plane[plane_index]); | |
| 3983 } | |
| 2967 | 3984 |
| 3985 | |
| 2138 | 3986 avctx->coded_frame= &s->current_picture; |
| 3987 switch(avctx->pix_fmt){ | |
| 3988 // case PIX_FMT_YUV444P: | |
| 3989 // case PIX_FMT_YUV422P: | |
| 3990 case PIX_FMT_YUV420P: | |
| 3991 case PIX_FMT_GRAY8: | |
| 3992 // case PIX_FMT_YUV411P: | |
| 3993 // case PIX_FMT_YUV410P: | |
| 3994 s->colorspace_type= 0; | |
| 3995 break; | |
| 3996 /* case PIX_FMT_RGBA32: | |
| 3997 s->colorspace= 1; | |
| 3998 break;*/ | |
| 3999 default: | |
| 4000 av_log(avctx, AV_LOG_ERROR, "format not supported\n"); | |
| 4001 return -1; | |
| 4002 } | |
| 4003 // avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); | |
| 4004 s->chroma_h_shift= 1; | |
| 4005 s->chroma_v_shift= 1; | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4006 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4007 ff_set_cmp(&s->dsp, s->dsp.me_cmp, s->avctx->me_cmp); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4008 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, s->avctx->me_sub_cmp); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4009 |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4010 s->avctx->get_buffer(s->avctx, &s->input_picture); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4011 |
| 3314 | 4012 if(s->avctx->me_method == ME_ITER){ |
| 4013 int i; | |
| 4014 int size= s->b_width * s->b_height << 2*s->block_max_depth; | |
| 4015 for(i=0; i<s->max_ref_frames; i++){ | |
| 4016 s->ref_mvs[i]= av_mallocz(size*sizeof(int16_t[2])); | |
| 4017 s->ref_scores[i]= av_mallocz(size*sizeof(uint32_t)); | |
| 4018 } | |
| 4019 } | |
| 4020 | |
| 2138 | 4021 return 0; |
| 4022 } | |
| 4023 | |
| 4024 static int frame_start(SnowContext *s){ | |
| 4025 AVFrame tmp; | |
| 2187 | 4026 int w= s->avctx->width; //FIXME round up to x16 ? |
| 4027 int h= s->avctx->height; | |
| 2138 | 4028 |
| 2187 | 4029 if(s->current_picture.data[0]){ |
| 4030 draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH ); | |
| 4031 draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2); | |
| 4032 draw_edges(s->current_picture.data[2], s->current_picture.linesize[2], w>>1, h>>1, EDGE_WIDTH/2); | |
| 4033 } | |
| 4034 | |
| 3314 | 4035 tmp= s->last_picture[s->max_ref_frames-1]; |
| 4036 memmove(s->last_picture+1, s->last_picture, (s->max_ref_frames-1)*sizeof(AVFrame)); | |
| 4037 s->last_picture[0]= s->current_picture; | |
| 2138 | 4038 s->current_picture= tmp; |
| 2967 | 4039 |
| 3314 | 4040 if(s->keyframe){ |
| 4041 s->ref_frames= 0; | |
| 4042 }else{ | |
| 4043 int i; | |
| 4044 for(i=0; i<s->max_ref_frames && s->last_picture[i].data[0]; i++) | |
| 4045 if(i && s->last_picture[i-1].key_frame) | |
| 4046 break; | |
| 4047 s->ref_frames= i; | |
| 4048 } | |
| 4049 | |
| 2138 | 4050 s->current_picture.reference= 1; |
| 4051 if(s->avctx->get_buffer(s->avctx, &s->current_picture) < 0){ | |
| 4052 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |
| 4053 return -1; | |
| 4054 } | |
| 2967 | 4055 |
| 3314 | 4056 s->current_picture.key_frame= s->keyframe; |
| 4057 | |
| 2138 | 4058 return 0; |
| 4059 } | |
| 4060 | |
| 4061 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
| 4062 SnowContext *s = avctx->priv_data; | |
| 2335 | 4063 RangeCoder * const c= &s->c; |
| 2138 | 4064 AVFrame *pict = data; |
| 4065 const int width= s->avctx->width; | |
| 4066 const int height= s->avctx->height; | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4067 int level, orientation, plane_index, i, y; |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4068 uint8_t rc_header_bak[sizeof(s->header_state)]; |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4069 uint8_t rc_block_bak[sizeof(s->block_state)]; |
| 2138 | 4070 |
| 2335 | 4071 ff_init_range_encoder(c, buf, buf_size); |
| 4072 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
| 2967 | 4073 |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4074 for(i=0; i<3; i++){ |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4075 int shift= !!i; |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4076 for(y=0; y<(height>>shift); y++) |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4077 memcpy(&s->input_picture.data[i][y * s->input_picture.linesize[i]], |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4078 &pict->data[i][y * pict->linesize[i]], |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4079 width>>shift); |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4080 } |
|
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4081 s->new_picture = *pict; |
| 2138 | 4082 |
| 3313 | 4083 s->m.picture_number= avctx->frame_number; |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4084 if(avctx->flags&CODEC_FLAG_PASS2){ |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4085 s->m.pict_type = |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4086 pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4087 s->keyframe= pict->pict_type==FF_I_TYPE; |
| 3766 | 4088 if(!(avctx->flags&CODEC_FLAG_QSCALE)) { |
| 3193 | 4089 pict->quality= ff_rate_estimate_qscale(&s->m, 0); |
| 3766 | 4090 if (pict->quality < 0) |
| 4091 return -1; | |
| 4092 } | |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4093 }else{ |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4094 s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0; |
| 3313 | 4095 s->m.pict_type= |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4096 pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4097 } |
| 2967 | 4098 |
| 3313 | 4099 if(s->pass1_rc && avctx->frame_number == 0) |
| 4100 pict->quality= 2*FF_QP2LAMBDA; | |
| 2161 | 4101 if(pict->quality){ |
|
3322
0b4f548dfb44
Snow: 10l. 1pass ratecontrol failed to set snow's internal quant.
lorenm
parents:
3314
diff
changeset
|
4102 s->qlog= qscale2qlog(pict->quality); |
| 3313 | 4103 s->lambda = pict->quality * 3/2; |
| 4104 } | |
| 4105 if(s->qlog < 0 || (!pict->quality && (avctx->flags & CODEC_FLAG_QSCALE))){ | |
| 2161 | 4106 s->qlog= LOSSLESS_QLOG; |
| 3313 | 4107 s->lambda = 0; |
| 4108 }//else keep previous frame's qlog until after motion est | |
| 2138 | 4109 |
| 4110 frame_start(s); | |
| 4111 | |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4112 s->m.current_picture_ptr= &s->m.current_picture; |
| 2138 | 4113 if(pict->pict_type == P_TYPE){ |
| 4114 int block_width = (width +15)>>4; | |
| 4115 int block_height= (height+15)>>4; | |
| 4116 int stride= s->current_picture.linesize[0]; | |
| 2967 | 4117 |
| 2138 | 4118 assert(s->current_picture.data[0]); |
| 3314 | 4119 assert(s->last_picture[0].data[0]); |
| 2967 | 4120 |
| 2138 | 4121 s->m.avctx= s->avctx; |
| 4122 s->m.current_picture.data[0]= s->current_picture.data[0]; | |
| 3314 | 4123 s->m. last_picture.data[0]= s->last_picture[0].data[0]; |
| 2138 | 4124 s->m. new_picture.data[0]= s-> input_picture.data[0]; |
| 4125 s->m. last_picture_ptr= &s->m. last_picture; | |
| 4126 s->m.linesize= | |
| 4127 s->m. last_picture.linesize[0]= | |
| 4128 s->m. new_picture.linesize[0]= | |
| 4129 s->m.current_picture.linesize[0]= stride; | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4130 s->m.uvlinesize= s->current_picture.linesize[1]; |
| 2138 | 4131 s->m.width = width; |
| 4132 s->m.height= height; | |
| 4133 s->m.mb_width = block_width; | |
| 4134 s->m.mb_height= block_height; | |
| 4135 s->m.mb_stride= s->m.mb_width+1; | |
| 4136 s->m.b8_stride= 2*s->m.mb_width+1; | |
| 4137 s->m.f_code=1; | |
| 4138 s->m.pict_type= pict->pict_type; | |
| 4139 s->m.me_method= s->avctx->me_method; | |
| 4140 s->m.me.scene_change_score=0; | |
| 4141 s->m.flags= s->avctx->flags; | |
| 4142 s->m.quarter_sample= (s->avctx->flags & CODEC_FLAG_QPEL)!=0; | |
| 4143 s->m.out_format= FMT_H263; | |
| 4144 s->m.unrestricted_mv= 1; | |
| 4145 | |
| 3313 | 4146 s->m.lambda = s->lambda; |
| 2138 | 4147 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7); |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4148 s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4149 |
| 2138 | 4150 s->m.dsp= s->dsp; //move |
| 4151 ff_init_me(&s->m); | |
|
2993
cb0e26759cca
iterative overlapped block based motion estimation for snow
michael
parents:
2979
diff
changeset
|
4152 s->dsp= s->m.dsp; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4153 } |
| 2967 | 4154 |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4155 if(s->pass1_rc){ |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4156 memcpy(rc_header_bak, s->header_state, sizeof(s->header_state)); |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4157 memcpy(rc_block_bak, s->block_state, sizeof(s->block_state)); |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4158 } |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4159 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4160 redo_frame: |
| 2967 | 4161 |
| 3313 | 4162 s->m.pict_type = pict->pict_type; |
| 2138 | 4163 s->qbias= pict->pict_type == P_TYPE ? 2 : 0; |
| 4164 | |
| 4165 encode_header(s); | |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4166 s->m.misc_bits = 8*(s->c.bytestream - s->c.bytestream_start); |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4167 encode_blocks(s, 1); |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4168 s->m.mv_bits = 8*(s->c.bytestream - s->c.bytestream_start) - s->m.misc_bits; |
| 2967 | 4169 |
| 2138 | 4170 for(plane_index=0; plane_index<3; plane_index++){ |
| 4171 Plane *p= &s->plane[plane_index]; | |
| 4172 int w= p->width; | |
| 4173 int h= p->height; | |
| 4174 int x, y; | |
| 2198 | 4175 // int bits= put_bits_count(&s->c.pb); |
| 2138 | 4176 |
|
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4177 if(!(avctx->flags2 & CODEC_FLAG2_MEMC_ONLY)){ |
| 2138 | 4178 //FIXME optimize |
| 4179 if(pict->data[plane_index]) //FIXME gray hack | |
| 4180 for(y=0; y<h; y++){ | |
| 4181 for(x=0; x<w; x++){ | |
| 2246 | 4182 s->spatial_dwt_buffer[y*w + x]= pict->data[plane_index][y*pict->linesize[plane_index] + x]<<FRAC_BITS; |
| 2138 | 4183 } |
| 4184 } | |
| 4185 predict_plane(s, s->spatial_dwt_buffer, plane_index, 0); | |
| 2967 | 4186 |
| 4187 if( plane_index==0 | |
| 4188 && pict->pict_type == P_TYPE | |
| 3313 | 4189 && !(avctx->flags&CODEC_FLAG_PASS2) |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4190 && s->m.me.scene_change_score > s->avctx->scenechange_threshold){ |
| 2335 | 4191 ff_init_range_encoder(c, buf, buf_size); |
| 4192 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4193 pict->pict_type= FF_I_TYPE; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4194 s->keyframe=1; |
| 3314 | 4195 s->current_picture.key_frame=1; |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4196 goto redo_frame; |
|
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4197 } |
| 2967 | 4198 |
| 2161 | 4199 if(s->qlog == LOSSLESS_QLOG){ |
| 4200 for(y=0; y<h; y++){ | |
| 4201 for(x=0; x<w; x++){ | |
| 2595 | 4202 s->spatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + (1<<(FRAC_BITS-1))-1)>>FRAC_BITS; |
| 2161 | 4203 } |
| 4204 } | |
| 4205 } | |
| 2967 | 4206 |
| 2164 | 4207 ff_spatial_dwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
| 2161 | 4208 |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4209 if(s->pass1_rc && plane_index==0){ |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4210 int delta_qlog = ratecontrol_1pass(s, pict); |
|
4011
5bce97c30a69
-1 is a valid return value in ratecontrol_1pass() -> 100l for takis
michael
parents:
4001
diff
changeset
|
4211 if (delta_qlog <= INT_MIN) |
| 3766 | 4212 return -1; |
|
3661
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4213 if(delta_qlog){ |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4214 //reordering qlog in the bitstream would eliminate this reset |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4215 ff_init_range_encoder(c, buf, buf_size); |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4216 memcpy(s->header_state, rc_header_bak, sizeof(s->header_state)); |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4217 memcpy(s->block_state, rc_block_bak, sizeof(s->block_state)); |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4218 encode_header(s); |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4219 encode_blocks(s, 0); |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4220 } |
|
b4425339894b
fix snow 1pass rc: the qlog used and the one written to the bitstream weren't always the same.
lorenm
parents:
3556
diff
changeset
|
4221 } |
| 3313 | 4222 |
| 2138 | 4223 for(level=0; level<s->spatial_decomposition_count; level++){ |
| 4224 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
| 4225 SubBand *b= &p->band[level][orientation]; | |
| 2967 | 4226 |
| 2138 | 4227 quantize(s, b, b->buf, b->stride, s->qbias); |
| 4228 if(orientation==0) | |
| 4229 decorrelate(s, b, b->buf, b->stride, pict->pict_type == P_TYPE, 0); | |
| 4230 encode_subband(s, b, b->buf, b->parent ? b->parent->buf : NULL, b->stride, orientation); | |
| 4231 assert(b->parent==NULL || b->parent->stride == b->stride*2); | |
| 4232 if(orientation==0) | |
| 4233 correlate(s, b, b->buf, b->stride, 1, 0); | |
| 4234 } | |
| 4235 } | |
| 4236 // av_log(NULL, AV_LOG_DEBUG, "plane:%d bits:%d\n", plane_index, put_bits_count(&s->c.pb) - bits); | |
| 4237 | |
| 4238 for(level=0; level<s->spatial_decomposition_count; level++){ | |
| 4239 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
| 4240 SubBand *b= &p->band[level][orientation]; | |
| 4241 | |
| 4242 dequantize(s, b, b->buf, b->stride); | |
| 4243 } | |
| 4244 } | |
| 2161 | 4245 |
| 2164 | 4246 ff_spatial_idwt(s->spatial_dwt_buffer, w, h, w, s->spatial_decomposition_type, s->spatial_decomposition_count); |
| 2161 | 4247 if(s->qlog == LOSSLESS_QLOG){ |
| 4248 for(y=0; y<h; y++){ | |
| 4249 for(x=0; x<w; x++){ | |
| 2246 | 4250 s->spatial_dwt_buffer[y*w + x]<<=FRAC_BITS; |
| 2161 | 4251 } |
| 4252 } | |
| 4253 } | |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
4254 {START_TIMER |
| 2138 | 4255 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
4256 STOP_TIMER("pred-conv")} |
|
3338
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4257 }else{ |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4258 //ME/MC only |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4259 if(pict->pict_type == I_TYPE){ |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4260 for(y=0; y<h; y++){ |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4261 for(x=0; x<w; x++){ |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4262 s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]= |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4263 pict->data[plane_index][y*pict->linesize[plane_index] + x]; |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4264 } |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4265 } |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4266 }else{ |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4267 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h); |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4268 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4269 } |
|
937f14bb0f23
support doing motion estimation and compensation without any residual transform or coding
michael
parents:
3327
diff
changeset
|
4270 } |
| 2138 | 4271 if(s->avctx->flags&CODEC_FLAG_PSNR){ |
| 4272 int64_t error= 0; | |
| 2967 | 4273 |
| 2138 | 4274 if(pict->data[plane_index]) //FIXME gray hack |
| 4275 for(y=0; y<h; y++){ | |
| 4276 for(x=0; x<w; x++){ | |
| 2161 | 4277 int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x]; |
| 2138 | 4278 error += d*d; |
| 4279 } | |
| 4280 } | |
| 4281 s->avctx->error[plane_index] += error; | |
| 2232 | 4282 s->current_picture.error[plane_index] = error; |
| 2138 | 4283 } |
| 4284 } | |
| 4285 | |
| 3314 | 4286 if(s->last_picture[s->max_ref_frames-1].data[0]) |
| 4287 avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]); | |
| 2138 | 4288 |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4289 s->current_picture.coded_picture_number = avctx->frame_number; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4290 s->current_picture.pict_type = pict->pict_type; |
|
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4291 s->current_picture.quality = pict->quality; |
| 3313 | 4292 s->m.frame_bits = 8*(s->c.bytestream - s->c.bytestream_start); |
| 4293 s->m.p_tex_bits = s->m.frame_bits - s->m.misc_bits - s->m.mv_bits; | |
| 4294 s->m.current_picture.display_picture_number = | |
| 4295 s->m.current_picture.coded_picture_number = avctx->frame_number; | |
| 4296 s->m.current_picture.quality = pict->quality; | |
| 4297 s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start); | |
| 4298 if(s->pass1_rc) | |
| 3766 | 4299 if (ff_rate_estimate_qscale(&s->m, 0) < 0) |
| 4300 return -1; | |
| 3313 | 4301 if(avctx->flags&CODEC_FLAG_PASS1) |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4302 ff_write_pass1_stats(&s->m); |
| 3313 | 4303 s->m.last_pict_type = s->m.pict_type; |
|
4123
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4304 avctx->frame_bits = s->m.frame_bits; |
|
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4305 avctx->mv_bits = s->m.mv_bits; |
|
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4306 avctx->misc_bits = s->m.misc_bits; |
|
5c86acb39889
outputs bit spent on various encoding functions (motion vectors, overhead, etc)
gpoirier
parents:
4122
diff
changeset
|
4307 avctx->p_tex_bits = s->m.p_tex_bits; |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4308 |
| 2138 | 4309 emms_c(); |
| 2967 | 4310 |
| 2335 | 4311 return ff_rac_terminate(c); |
| 2138 | 4312 } |
| 4313 | |
| 4314 static void common_end(SnowContext *s){ | |
| 3314 | 4315 int plane_index, level, orientation, i; |
| 2192 | 4316 |
| 2138 | 4317 av_freep(&s->spatial_dwt_buffer); |
| 4318 | |
| 2967 | 4319 av_freep(&s->m.me.scratchpad); |
| 2138 | 4320 av_freep(&s->m.me.map); |
| 4321 av_freep(&s->m.me.score_map); | |
|
3033
e8599ab02b38
faster iterative_me: avoid duplicate mc of neighboring blocks.
lorenm
parents:
3020
diff
changeset
|
4322 av_freep(&s->m.obmc_scratchpad); |
| 2967 | 4323 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4324 av_freep(&s->block); |
| 2192 | 4325 |
| 3314 | 4326 for(i=0; i<MAX_REF_FRAMES; i++){ |
| 4327 av_freep(&s->ref_mvs[i]); | |
| 4328 av_freep(&s->ref_scores[i]); | |
| 4329 if(s->last_picture[i].data[0]) | |
| 4330 s->avctx->release_buffer(s->avctx, &s->last_picture[i]); | |
| 4331 } | |
| 4332 | |
| 2967 | 4333 for(plane_index=0; plane_index<3; plane_index++){ |
| 2192 | 4334 for(level=s->spatial_decomposition_count-1; level>=0; level--){ |
| 4335 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
| 4336 SubBand *b= &s->plane[plane_index].band[level][orientation]; | |
| 2967 | 4337 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4338 av_freep(&b->x_coeff); |
| 2192 | 4339 } |
| 4340 } | |
| 4341 } | |
| 2138 | 4342 } |
| 4343 | |
| 4344 static int encode_end(AVCodecContext *avctx) | |
| 4345 { | |
| 4346 SnowContext *s = avctx->priv_data; | |
| 4347 | |
| 4348 common_end(s); | |
|
2608
4fb7fa34050b
allow 2pass ratecontrol. also fixes psnr displayed by mencoder.
lorenm
parents:
2607
diff
changeset
|
4349 av_free(avctx->stats_out); |
| 2138 | 4350 |
| 4351 return 0; | |
| 4352 } | |
| 4353 | |
| 4354 static int decode_init(AVCodecContext *avctx) | |
| 4355 { | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4356 SnowContext *s = avctx->priv_data; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4357 int block_size; |
| 2967 | 4358 |
| 2635 | 4359 avctx->pix_fmt= PIX_FMT_YUV420P; |
| 2138 | 4360 |
| 4361 common_init(avctx); | |
| 2967 | 4362 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4363 block_size = MB_SIZE >> s->block_max_depth; |
| 3017 | 4364 slice_buffer_init(&s->sb, s->plane[0].height, (block_size) + (s->spatial_decomposition_count * (s->spatial_decomposition_count + 3)) + 1, s->plane[0].width, s->spatial_dwt_buffer); |
| 2967 | 4365 |
| 2138 | 4366 return 0; |
| 4367 } | |
| 4368 | |
| 4369 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){ | |
| 4370 SnowContext *s = avctx->priv_data; | |
| 2335 | 4371 RangeCoder * const c= &s->c; |
| 2138 | 4372 int bytes_read; |
| 4373 AVFrame *picture = data; | |
| 2198 | 4374 int level, orientation, plane_index; |
| 2138 | 4375 |
| 2335 | 4376 ff_init_range_decoder(c, buf, buf_size); |
| 4377 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8); | |
| 2138 | 4378 |
| 4379 s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P | |
| 4380 decode_header(s); | |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4381 if(!s->block) alloc_blocks(s); |
| 2138 | 4382 |
| 4383 frame_start(s); | |
| 4384 //keyframe flag dupliaction mess FIXME | |
| 4385 if(avctx->debug&FF_DEBUG_PICT_INFO) | |
| 4386 av_log(avctx, AV_LOG_ERROR, "keyframe:%d qlog:%d\n", s->keyframe, s->qlog); | |
| 2967 | 4387 |
|
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2187
diff
changeset
|
4388 decode_blocks(s); |
| 2138 | 4389 |
| 4390 for(plane_index=0; plane_index<3; plane_index++){ | |
| 4391 Plane *p= &s->plane[plane_index]; | |
| 4392 int w= p->width; | |
| 4393 int h= p->height; | |
| 4394 int x, y; | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4395 int decode_state[MAX_DECOMPOSITIONS][4][1]; /* Stored state info for unpack_coeffs. 1 variable per instance. */ |
| 2967 | 4396 |
| 2138 | 4397 if(s->avctx->debug&2048){ |
| 4398 memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h); | |
| 4399 predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); | |
| 4400 | |
| 4401 for(y=0; y<h; y++){ | |
| 4402 for(x=0; x<w; x++){ | |
|
2249
2b1a5e1fd449
merge predict_plane() with DWTELEM->8bit conversation (21% faster)
michael
parents:
2246
diff
changeset
|
4403 int v= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]; |
| 2138 | 4404 s->mconly_picture.data[plane_index][y*s->mconly_picture.linesize[plane_index] + x]= v; |
| 4405 } | |
| 4406 } | |
| 4407 } | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4408 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4409 { START_TIMER |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4410 for(level=0; level<s->spatial_decomposition_count; level++){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4411 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4412 SubBand *b= &p->band[level][orientation]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4413 unpack_coeffs(s, b, b->parent, orientation); |
| 2138 | 4414 } |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4415 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4416 STOP_TIMER("unpack coeffs"); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4417 } |
| 2138 | 4418 |
| 2562 | 4419 {START_TIMER |
| 4420 const int mb_h= s->b_height << s->block_max_depth; | |
| 4421 const int block_size = MB_SIZE >> s->block_max_depth; | |
| 4422 const int block_w = plane_index ? block_size/2 : block_size; | |
| 4423 int mb_y; | |
| 4424 dwt_compose_t cs[MAX_DECOMPOSITIONS]; | |
| 4425 int yd=0, yq=0; | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4426 int y; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4427 int end_y; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4428 |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4429 ff_spatial_idwt_buffered_init(cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count); |
| 2562 | 4430 for(mb_y=0; mb_y<=mb_h; mb_y++){ |
| 2967 | 4431 |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4432 int slice_starty = block_w*mb_y; |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4433 int slice_h = block_w*(mb_y+1); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4434 if (!(s->keyframe || s->avctx->debug&512)){ |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4435 slice_starty = FFMAX(0, slice_starty - (block_w >> 1)); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4436 slice_h -= (block_w >> 1); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4437 } |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4438 |
| 2967 | 4439 { |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4440 START_TIMER |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4441 for(level=0; level<s->spatial_decomposition_count; level++){ |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4442 for(orientation=level ? 1 : 0; orientation<4; orientation++){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4443 SubBand *b= &p->band[level][orientation]; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4444 int start_y; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4445 int end_y; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4446 int our_mb_start = mb_y; |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4447 int our_mb_end = (mb_y + 1); |
| 3012 | 4448 const int extra= 3; |
| 4449 start_y = (mb_y ? ((block_w * our_mb_start) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra: 0); | |
| 4450 end_y = (((block_w * our_mb_end) >> (s->spatial_decomposition_count - level)) + s->spatial_decomposition_count - level + extra); | |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4451 if (!(s->keyframe || s->avctx->debug&512)){ |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4452 start_y = FFMAX(0, start_y - (block_w >> (1+s->spatial_decomposition_count - level))); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4453 end_y = FFMAX(0, end_y - (block_w >> (1+s->spatial_decomposition_count - level))); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4454 } |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4455 start_y = FFMIN(b->height, start_y); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4456 end_y = FFMIN(b->height, end_y); |
| 2967 | 4457 |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4458 if (start_y != end_y){ |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4459 if (orientation == 0){ |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4460 SubBand * correlate_band = &p->band[0][0]; |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4461 int correlate_end_y = FFMIN(b->height, end_y + 1); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4462 int correlate_start_y = FFMIN(b->height, (start_y ? start_y + 1 : 0)); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4463 decode_subband_slice_buffered(s, correlate_band, &s->sb, correlate_start_y, correlate_end_y, decode_state[0][0]); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4464 correlate_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, 1, 0, correlate_start_y, correlate_end_y); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4465 dequantize_slice_buffered(s, &s->sb, correlate_band, correlate_band->buf, correlate_band->stride, start_y, end_y); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4466 } |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4467 else |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4468 decode_subband_slice_buffered(s, b, &s->sb, start_y, end_y, decode_state[level][orientation]); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4469 } |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4470 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4471 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4472 STOP_TIMER("decode_subband_slice"); |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4473 } |
| 2967 | 4474 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4475 { START_TIMER |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4476 for(; yd<slice_h; yd+=4){ |
|
3198
6b9f0c4fbdbe
First part of a series of speed-enchancing patches.
gpoirier
parents:
3197
diff
changeset
|
4477 ff_spatial_idwt_buffered_slice(&s->dsp, cs, &s->sb, w, h, 1, s->spatial_decomposition_type, s->spatial_decomposition_count, yd); |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4478 } |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4479 STOP_TIMER("idwt slice");} |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4480 |
| 2967 | 4481 |
| 2161 | 4482 if(s->qlog == LOSSLESS_QLOG){ |
| 2562 | 4483 for(; yq<slice_h && yq<h; yq++){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4484 DWTELEM * line = slice_buffer_get_line(&s->sb, yq); |
| 2161 | 4485 for(x=0; x<w; x++){ |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4486 line[x] <<= FRAC_BITS; |
| 2161 | 4487 } |
| 4488 } | |
| 4489 } | |
| 2562 | 4490 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4491 predict_slice_buffered(s, &s->sb, s->spatial_dwt_buffer, plane_index, 1, mb_y); |
| 2967 | 4492 |
|
2634
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4493 y = FFMIN(p->height, slice_starty); |
|
337217ecbb3e
tighter snow slicing patch by (Yartrebo || yartrebo earthlink net)
michael
parents:
2628
diff
changeset
|
4494 end_y = FFMIN(p->height, slice_h); |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4495 while(y < end_y) |
|
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4496 slice_buffer_release(&s->sb, y++); |
| 2562 | 4497 } |
| 2967 | 4498 |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4499 slice_buffer_flush(&s->sb); |
| 2967 | 4500 |
| 2562 | 4501 STOP_TIMER("idwt + predict_slices")} |
| 2138 | 4502 } |
| 2967 | 4503 |
| 2138 | 4504 emms_c(); |
| 4505 | |
| 3314 | 4506 if(s->last_picture[s->max_ref_frames-1].data[0]) |
| 4507 avctx->release_buffer(avctx, &s->last_picture[s->max_ref_frames-1]); | |
| 2138 | 4508 |
| 2967 | 4509 if(!(s->avctx->debug&2048)) |
| 2138 | 4510 *picture= s->current_picture; |
| 4511 else | |
| 4512 *picture= s->mconly_picture; | |
| 2967 | 4513 |
| 2138 | 4514 *data_size = sizeof(AVFrame); |
| 2967 | 4515 |
| 2335 | 4516 bytes_read= c->bytestream - c->bytestream_start; |
| 4517 if(bytes_read ==0) av_log(s->avctx, AV_LOG_ERROR, "error at end of frame\n"); //FIXME | |
| 2138 | 4518 |
| 4519 return bytes_read; | |
| 4520 } | |
| 4521 | |
| 4522 static int decode_end(AVCodecContext *avctx) | |
| 4523 { | |
| 4524 SnowContext *s = avctx->priv_data; | |
| 4525 | |
|
2589
a5a62827f195
Snow Slicing patch by (Yartrebo) yartrebo earthlink net
michael
parents:
2562
diff
changeset
|
4526 slice_buffer_destroy(&s->sb); |
| 2967 | 4527 |
| 2138 | 4528 common_end(s); |
| 4529 | |
| 4530 return 0; | |
| 4531 } | |
| 4532 | |
| 4533 AVCodec snow_decoder = { | |
| 4534 "snow", | |
| 4535 CODEC_TYPE_VIDEO, | |
| 4536 CODEC_ID_SNOW, | |
| 4537 sizeof(SnowContext), | |
| 4538 decode_init, | |
| 4539 NULL, | |
| 4540 decode_end, | |
| 4541 decode_frame, | |
| 4542 0 /*CODEC_CAP_DR1*/ /*| CODEC_CAP_DRAW_HORIZ_BAND*/, | |
| 4543 NULL | |
| 4544 }; | |
| 4545 | |
|
2408
a6e4da1c28ee
Disable encoders patch by (Gianluigi Tiesi <mplayer netfarm it>)
michael
parents:
2368
diff
changeset
|
4546 #ifdef CONFIG_ENCODERS |
| 2138 | 4547 AVCodec snow_encoder = { |
| 4548 "snow", | |
| 4549 CODEC_TYPE_VIDEO, | |
| 4550 CODEC_ID_SNOW, | |
| 4551 sizeof(SnowContext), | |
| 4552 encode_init, | |
| 4553 encode_frame, | |
| 4554 encode_end, | |
| 4555 }; | |
|
2408
a6e4da1c28ee
Disable encoders patch by (Gianluigi Tiesi <mplayer netfarm it>)
michael
parents:
2368
diff
changeset
|
4556 #endif |
| 2138 | 4557 |
| 4558 | |
| 4559 #if 0 | |
| 4560 #undef malloc | |
| 4561 #undef free | |
| 4562 #undef printf | |
| 4563 | |
| 4564 int main(){ | |
| 4565 int width=256; | |
| 4566 int height=256; | |
| 4567 int buffer[2][width*height]; | |
| 4568 SnowContext s; | |
| 4569 int i; | |
| 4570 s.spatial_decomposition_count=6; | |
| 4571 s.spatial_decomposition_type=1; | |
| 2967 | 4572 |
| 2138 | 4573 printf("testing 5/3 DWT\n"); |
| 4574 for(i=0; i<width*height; i++) | |
| 4575 buffer[0][i]= buffer[1][i]= random()%54321 - 12345; | |
| 2967 | 4576 |
| 2951 | 4577 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
| 4578 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
| 2967 | 4579 |
| 2138 | 4580 for(i=0; i<width*height; i++) |
| 4581 if(buffer[0][i]!= buffer[1][i]) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]); | |
| 4582 | |
| 4583 printf("testing 9/7 DWT\n"); | |
| 4584 s.spatial_decomposition_type=0; | |
| 4585 for(i=0; i<width*height; i++) | |
| 4586 buffer[0][i]= buffer[1][i]= random()%54321 - 12345; | |
| 2967 | 4587 |
| 2951 | 4588 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
| 4589 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); | |
| 2967 | 4590 |
| 2138 | 4591 for(i=0; i<width*height; i++) |
| 4001 | 4592 if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %d %d %d\n",i, buffer[0][i], buffer[1][i]); |
| 2967 | 4593 |
| 2951 | 4594 #if 0 |
| 2138 | 4595 printf("testing AC coder\n"); |
| 4596 memset(s.header_state, 0, sizeof(s.header_state)); | |
| 2335 | 4597 ff_init_range_encoder(&s.c, buffer[0], 256*256); |
| 2138 | 4598 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
| 2967 | 4599 |
| 2138 | 4600 for(i=-256; i<256; i++){ |
| 4601 START_TIMER | |
| 4001 | 4602 put_symbol(&s.c, s.header_state, i*i*i/3*FFABS(i), 1); |
| 2138 | 4603 STOP_TIMER("put_symbol") |
| 4604 } | |
| 2335 | 4605 ff_rac_terminate(&s.c); |
| 2138 | 4606 |
| 4607 memset(s.header_state, 0, sizeof(s.header_state)); | |
| 2335 | 4608 ff_init_range_decoder(&s.c, buffer[0], 256*256); |
| 2138 | 4609 ff_init_cabac_states(&s.c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); |
| 2967 | 4610 |
| 2138 | 4611 for(i=-256; i<256; i++){ |
| 4612 int j; | |
| 4613 START_TIMER | |
| 4614 j= get_symbol(&s.c, s.header_state, 1); | |
| 4615 STOP_TIMER("get_symbol") | |
| 4001 | 4616 if(j!=i*i*i/3*FFABS(i)) printf("fsck: %d != %d\n", i, j); |
| 2138 | 4617 } |
| 2951 | 4618 #endif |
| 2138 | 4619 { |
| 4620 int level, orientation, x, y; | |
| 4621 int64_t errors[8][4]; | |
| 4622 int64_t g=0; | |
| 4623 | |
| 4624 memset(errors, 0, sizeof(errors)); | |
| 4625 s.spatial_decomposition_count=3; | |
| 4626 s.spatial_decomposition_type=0; | |
| 4627 for(level=0; level<s.spatial_decomposition_count; level++){ | |
| 4628 for(orientation=level ? 1 : 0; orientation<4; orientation++){ | |
| 4629 int w= width >> (s.spatial_decomposition_count-level); | |
| 4630 int h= height >> (s.spatial_decomposition_count-level); | |
| 4631 int stride= width << (s.spatial_decomposition_count-level); | |
| 4632 DWTELEM *buf= buffer[0]; | |
| 4633 int64_t error=0; | |
| 4634 | |
| 4635 if(orientation&1) buf+=w; | |
| 4636 if(orientation>1) buf+=stride>>1; | |
| 2967 | 4637 |
| 2138 | 4638 memset(buffer[0], 0, sizeof(int)*width*height); |
| 4639 buf[w/2 + h/2*stride]= 256*256; | |
| 2951 | 4640 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
| 2138 | 4641 for(y=0; y<height; y++){ |
| 4642 for(x=0; x<width; x++){ | |
| 4643 int64_t d= buffer[0][x + y*width]; | |
| 4644 error += d*d; | |
|
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4011
diff
changeset
|
4645 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8"PRId64" ", d); |
| 2138 | 4646 } |
| 4001 | 4647 if(FFABS(height/2-y)<9 && level==2) printf("\n"); |
| 2138 | 4648 } |
| 4649 error= (int)(sqrt(error)+0.5); | |
| 4650 errors[level][orientation]= error; | |
| 4651 if(g) g=ff_gcd(g, error); | |
| 4652 else g= error; | |
| 4653 } | |
| 4654 } | |
| 4655 printf("static int const visual_weight[][4]={\n"); | |
| 4656 for(level=0; level<s.spatial_decomposition_count; level++){ | |
| 4657 printf(" {"); | |
| 4658 for(orientation=0; orientation<4; orientation++){ | |
|
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4011
diff
changeset
|
4659 printf("%8"PRId64",", errors[level][orientation]/g); |
| 2138 | 4660 } |
| 4661 printf("},\n"); | |
| 4662 } | |
| 4663 printf("};\n"); | |
| 4664 { | |
| 4665 int level=2; | |
| 4666 int orientation=3; | |
| 4667 int w= width >> (s.spatial_decomposition_count-level); | |
| 4668 int h= height >> (s.spatial_decomposition_count-level); | |
| 4669 int stride= width << (s.spatial_decomposition_count-level); | |
| 4670 DWTELEM *buf= buffer[0]; | |
| 4671 int64_t error=0; | |
| 4672 | |
| 4673 buf+=w; | |
| 4674 buf+=stride>>1; | |
| 2967 | 4675 |
| 2138 | 4676 memset(buffer[0], 0, sizeof(int)*width*height); |
| 4677 #if 1 | |
| 4678 for(y=0; y<height; y++){ | |
| 4679 for(x=0; x<width; x++){ | |
| 4680 int tab[4]={0,2,3,1}; | |
| 4681 buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)]; | |
| 4682 } | |
| 4683 } | |
| 2951 | 4684 ff_spatial_dwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
| 2138 | 4685 #else |
| 4686 for(y=0; y<h; y++){ | |
| 4687 for(x=0; x<w; x++){ | |
| 4688 buf[x + y*stride ]=169; | |
| 4689 buf[x + y*stride-w]=64; | |
| 4690 } | |
| 4691 } | |
| 2951 | 4692 ff_spatial_idwt(buffer[0], width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count); |
| 2138 | 4693 #endif |
| 4694 for(y=0; y<height; y++){ | |
| 4695 for(x=0; x<width; x++){ | |
| 4696 int64_t d= buffer[0][x + y*width]; | |
| 4697 error += d*d; | |
|
4122
daae66c03857
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
4011
diff
changeset
|
4698 if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8"PRId64" ", d); |
| 2138 | 4699 } |
| 4001 | 4700 if(FFABS(height/2-y)<9) printf("\n"); |
| 2138 | 4701 } |
| 4702 } | |
| 4703 | |
| 4704 } | |
| 4705 return 0; | |
| 4706 } | |
| 4707 #endif | |
| 4708 |
