Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(469)

Side by Side Diff: third_party/libwebp/enc/iterator.c

Issue 10832153: libwebp: update snapshot to v0.2.0-rc1 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 Google Inc. 1 // Copyright 2011 Google Inc. All Rights Reserved.
2 // 2 //
3 // This code is licensed under the same terms as WebM: 3 // This code is licensed under the same terms as WebM:
4 // Software License Agreement: http://www.webmproject.org/license/software/ 4 // Software License Agreement: http://www.webmproject.org/license/software/
5 // Additional IP Rights Grant: http://www.webmproject.org/license/additional/ 5 // Additional IP Rights Grant: http://www.webmproject.org/license/additional/
6 // ----------------------------------------------------------------------------- 6 // -----------------------------------------------------------------------------
7 // 7 //
8 // VP8Iterator: block iterator 8 // VP8Iterator: block iterator
9 // 9 //
10 // Author: Skal (pascal.massimino@gmail.com) 10 // Author: Skal (pascal.massimino@gmail.com)
11 11
12 #include <stdlib.h>
13 #include <string.h> 12 #include <string.h>
14 #include "vp8enci.h" 13
14 #include "./vp8enci.h"
15 15
16 #if defined(__cplusplus) || defined(c_plusplus) 16 #if defined(__cplusplus) || defined(c_plusplus)
17 extern "C" { 17 extern "C" {
18 #endif 18 #endif
19 19
20 //------------------------------------------------------------------------------ 20 //------------------------------------------------------------------------------
21 // VP8Iterator 21 // VP8Iterator
22 //------------------------------------------------------------------------------ 22 //------------------------------------------------------------------------------
23 23
24 static void InitLeft(VP8EncIterator* const it) { 24 static void InitLeft(VP8EncIterator* const it) {
25 const VP8Encoder* const enc = it->enc_; 25 const VP8Encoder* const enc = it->enc_;
26 enc->y_left_[-1] = enc->u_left_[-1] = enc->v_left_[-1] = 26 enc->y_left_[-1] = enc->u_left_[-1] = enc->v_left_[-1] =
27 (it->y_) > 0 ? 129 : 127; 27 (it->y_ > 0) ? 129 : 127;
28 memset(enc->y_left_, 129, 16); 28 memset(enc->y_left_, 129, 16);
29 memset(enc->u_left_, 129, 8); 29 memset(enc->u_left_, 129, 8);
30 memset(enc->v_left_, 129, 8); 30 memset(enc->v_left_, 129, 8);
31 it->left_nz_[8] = 0; 31 it->left_nz_[8] = 0;
32 } 32 }
33 33
34 static void InitTop(VP8EncIterator* const it) { 34 static void InitTop(VP8EncIterator* const it) {
35 const VP8Encoder* const enc = it->enc_; 35 const VP8Encoder* const enc = it->enc_;
36 const int top_size = enc->mb_w_ * 16; 36 const size_t top_size = enc->mb_w_ * 16;
37 memset(enc->y_top_, 127, 2 * top_size); 37 memset(enc->y_top_, 127, 2 * top_size);
38 memset(enc->nz_, 0, enc->mb_w_ * sizeof(*enc->nz_)); 38 memset(enc->nz_, 0, enc->mb_w_ * sizeof(*enc->nz_));
39 } 39 }
40 40
41 void VP8IteratorReset(VP8EncIterator* const it) { 41 void VP8IteratorReset(VP8EncIterator* const it) {
42 VP8Encoder* const enc = it->enc_; 42 VP8Encoder* const enc = it->enc_;
43 it->x_ = 0; 43 it->x_ = 0;
44 it->y_ = 0; 44 it->y_ = 0;
45 it->y_offset_ = 0; 45 it->y_offset_ = 0;
46 it->uv_offset_ = 0; 46 it->uv_offset_ = 0;
(...skipping 11 matching lines...) Expand all
58 void VP8IteratorInit(VP8Encoder* const enc, VP8EncIterator* const it) { 58 void VP8IteratorInit(VP8Encoder* const enc, VP8EncIterator* const it) {
59 it->enc_ = enc; 59 it->enc_ = enc;
60 it->y_stride_ = enc->pic_->y_stride; 60 it->y_stride_ = enc->pic_->y_stride;
61 it->uv_stride_ = enc->pic_->uv_stride; 61 it->uv_stride_ = enc->pic_->uv_stride;
62 // TODO(later): for multithreading, these should be owned by 'it'. 62 // TODO(later): for multithreading, these should be owned by 'it'.
63 it->yuv_in_ = enc->yuv_in_; 63 it->yuv_in_ = enc->yuv_in_;
64 it->yuv_out_ = enc->yuv_out_; 64 it->yuv_out_ = enc->yuv_out_;
65 it->yuv_out2_ = enc->yuv_out2_; 65 it->yuv_out2_ = enc->yuv_out2_;
66 it->yuv_p_ = enc->yuv_p_; 66 it->yuv_p_ = enc->yuv_p_;
67 it->lf_stats_ = enc->lf_stats_; 67 it->lf_stats_ = enc->lf_stats_;
68 it->percent0_ = enc->percent_;
68 VP8IteratorReset(it); 69 VP8IteratorReset(it);
69 } 70 }
70 71
72 int VP8IteratorProgress(const VP8EncIterator* const it, int delta) {
73 VP8Encoder* const enc = it->enc_;
74 if (delta && enc->pic_->progress_hook) {
75 const int percent = (enc->mb_h_ <= 1)
76 ? it->percent0_
77 : it->percent0_ + delta * it->y_ / (enc->mb_h_ - 1);
78 return WebPReportProgress(enc->pic_, percent, &enc->percent_);
79 }
80 return 1;
81 }
82
71 //------------------------------------------------------------------------------ 83 //------------------------------------------------------------------------------
72 // Import the source samples into the cache. Takes care of replicating 84 // Import the source samples into the cache. Takes care of replicating
73 // boundary pixels if necessary. 85 // boundary pixels if necessary.
74 86
87 static void ImportBlock(const uint8_t* src, int src_stride,
88 uint8_t* dst, int w, int h, int size) {
89 int i;
90 for (i = 0; i < h; ++i) {
91 memcpy(dst, src, w);
92 if (w < size) {
93 memset(dst + w, dst[w - 1], size - w);
94 }
95 dst += BPS;
96 src += src_stride;
97 }
98 for (i = h; i < size; ++i) {
99 memcpy(dst, dst - BPS, size);
100 dst += BPS;
101 }
102 }
103
75 void VP8IteratorImport(const VP8EncIterator* const it) { 104 void VP8IteratorImport(const VP8EncIterator* const it) {
76 const VP8Encoder* const enc = it->enc_; 105 const VP8Encoder* const enc = it->enc_;
77 const int x = it->x_, y = it->y_; 106 const int x = it->x_, y = it->y_;
78 const WebPPicture* const pic = enc->pic_; 107 const WebPPicture* const pic = enc->pic_;
79 const uint8_t* ysrc = pic->y + (y * pic->y_stride + x) * 16; 108 const uint8_t* const ysrc = pic->y + (y * pic->y_stride + x) * 16;
80 const uint8_t* usrc = pic->u + (y * pic->uv_stride + x) * 8; 109 const uint8_t* const usrc = pic->u + (y * pic->uv_stride + x) * 8;
81 const uint8_t* vsrc = pic->v + (y * pic->uv_stride + x) * 8; 110 const uint8_t* const vsrc = pic->v + (y * pic->uv_stride + x) * 8;
82 uint8_t* ydst = it->yuv_in_ + Y_OFF; 111 uint8_t* const ydst = it->yuv_in_ + Y_OFF;
83 uint8_t* udst = it->yuv_in_ + U_OFF; 112 uint8_t* const udst = it->yuv_in_ + U_OFF;
84 uint8_t* vdst = it->yuv_in_ + V_OFF; 113 uint8_t* const vdst = it->yuv_in_ + V_OFF;
85 int w = (pic->width - x * 16); 114 int w = (pic->width - x * 16);
86 int h = (pic->height - y * 16); 115 int h = (pic->height - y * 16);
87 int i;
88 116
89 if (w > 16) w = 16; 117 if (w > 16) w = 16;
90 if (h > 16) h = 16; 118 if (h > 16) h = 16;
119
91 // Luma plane 120 // Luma plane
92 for (i = 0; i < h; ++i) { 121 ImportBlock(ysrc, pic->y_stride, ydst, w, h, 16);
93 memcpy(ydst, ysrc, w); 122
94 if (w < 16) memset(ydst + w, ydst[w - 1], 16 - w); 123 { // U/V planes
95 ydst += BPS; 124 const int uv_w = (w + 1) >> 1;
96 ysrc += pic->y_stride; 125 const int uv_h = (h + 1) >> 1;
97 } 126 ImportBlock(usrc, pic->uv_stride, udst, uv_w, uv_h, 8);
98 for (i = h; i < 16; ++i) { 127 ImportBlock(vsrc, pic->uv_stride, vdst, uv_w, uv_h, 8);
99 memcpy(ydst, ydst - BPS, 16);
100 ydst += BPS;
101 }
102 // U/V plane
103 w = (w + 1) / 2;
104 h = (h + 1) / 2;
105 for (i = 0; i < h; ++i) {
106 memcpy(udst, usrc, w);
107 memcpy(vdst, vsrc, w);
108 if (w < 8) {
109 memset(udst + w, udst[w - 1], 8 - w);
110 memset(vdst + w, vdst[w - 1], 8 - w);
111 }
112 udst += BPS;
113 vdst += BPS;
114 usrc += pic->uv_stride;
115 vsrc += pic->uv_stride;
116 }
117 for (i = h; i < 8; ++i) {
118 memcpy(udst, udst - BPS, 8);
119 memcpy(vdst, vdst - BPS, 8);
120 udst += BPS;
121 vdst += BPS;
122 } 128 }
123 } 129 }
124 130
125 //------------------------------------------------------------------------------ 131 //------------------------------------------------------------------------------
126 // Copy back the compressed samples into user space if requested. 132 // Copy back the compressed samples into user space if requested.
127 133
134 static void ExportBlock(const uint8_t* src, uint8_t* dst, int dst_stride,
135 int w, int h) {
136 while (h-- > 0) {
137 memcpy(dst, src, w);
138 dst += dst_stride;
139 src += BPS;
140 }
141 }
142
128 void VP8IteratorExport(const VP8EncIterator* const it) { 143 void VP8IteratorExport(const VP8EncIterator* const it) {
129 const VP8Encoder* const enc = it->enc_; 144 const VP8Encoder* const enc = it->enc_;
130 if (enc->config_->show_compressed) { 145 if (enc->config_->show_compressed) {
131 const int x = it->x_, y = it->y_; 146 const int x = it->x_, y = it->y_;
132 const uint8_t* const ysrc = it->yuv_out_ + Y_OFF; 147 const uint8_t* const ysrc = it->yuv_out_ + Y_OFF;
133 const uint8_t* const usrc = it->yuv_out_ + U_OFF; 148 const uint8_t* const usrc = it->yuv_out_ + U_OFF;
134 const uint8_t* const vsrc = it->yuv_out_ + V_OFF; 149 const uint8_t* const vsrc = it->yuv_out_ + V_OFF;
135 const WebPPicture* const pic = enc->pic_; 150 const WebPPicture* const pic = enc->pic_;
136 uint8_t* ydst = pic->y + (y * pic->y_stride + x) * 16; 151 uint8_t* const ydst = pic->y + (y * pic->y_stride + x) * 16;
137 uint8_t* udst = pic->u + (y * pic->uv_stride + x) * 8; 152 uint8_t* const udst = pic->u + (y * pic->uv_stride + x) * 8;
138 uint8_t* vdst = pic->v + (y * pic->uv_stride + x) * 8; 153 uint8_t* const vdst = pic->v + (y * pic->uv_stride + x) * 8;
139 int w = (pic->width - x * 16); 154 int w = (pic->width - x * 16);
140 int h = (pic->height - y * 16); 155 int h = (pic->height - y * 16);
141 int i;
142 156
143 if (w > 16) w = 16; 157 if (w > 16) w = 16;
144 if (h > 16) h = 16; 158 if (h > 16) h = 16;
145 159
146 // Luma plane 160 // Luma plane
147 for (i = 0; i < h; ++i) { 161 ExportBlock(ysrc, ydst, pic->y_stride, w, h);
148 memcpy(ydst + i * pic->y_stride, ysrc + i * BPS, w); 162
149 } 163 { // U/V planes
150 // U/V plane 164 const int uv_w = (w + 1) >> 1;
151 { 165 const int uv_h = (h + 1) >> 1;
152 const int uv_w = (w + 1) / 2; 166 ExportBlock(usrc, udst, pic->uv_stride, uv_w, uv_h);
153 const int uv_h = (h + 1) / 2; 167 ExportBlock(vsrc, vdst, pic->uv_stride, uv_w, uv_h);
154 for (i = 0; i < uv_h; ++i) {
155 memcpy(udst + i * pic->uv_stride, usrc + i * BPS, uv_w);
156 memcpy(vdst + i * pic->uv_stride, vsrc + i * BPS, uv_w);
157 }
158 } 168 }
159 } 169 }
160 } 170 }
161 171
162 //------------------------------------------------------------------------------ 172 //------------------------------------------------------------------------------
163 // Non-zero contexts setup/teardown 173 // Non-zero contexts setup/teardown
164 174
165 // Nz bits: 175 // Nz bits:
166 // 0 1 2 3 Y 176 // 0 1 2 3 Y
167 // 4 5 6 7 177 // 4 5 6 7
168 // 8 9 10 11 178 // 8 9 10 11
169 // 12 13 14 15 179 // 12 13 14 15
170 // 16 17 U 180 // 16 17 U
171 // 18 19 181 // 18 19
172 // 20 21 V 182 // 20 21 V
173 // 22 23 183 // 22 23
174 // 24 DC-intra16 184 // 24 DC-intra16
175 185
176 // Convert packed context to byte array 186 // Convert packed context to byte array
177 #define BIT(nz, n) (!!((nz) & (1 << (n)))) 187 #define BIT(nz, n) (!!((nz) & (1 << (n))))
178 188
179 void VP8IteratorNzToBytes(VP8EncIterator* const it) { 189 void VP8IteratorNzToBytes(VP8EncIterator* const it) {
180 const int tnz = it->nz_[0], lnz = it->nz_[-1]; 190 const int tnz = it->nz_[0], lnz = it->nz_[-1];
191 int* const top_nz = it->top_nz_;
192 int* const left_nz = it->left_nz_;
181 193
182 // Top-Y 194 // Top-Y
183 it->top_nz_[0] = BIT(tnz, 12); 195 top_nz[0] = BIT(tnz, 12);
184 it->top_nz_[1] = BIT(tnz, 13); 196 top_nz[1] = BIT(tnz, 13);
185 it->top_nz_[2] = BIT(tnz, 14); 197 top_nz[2] = BIT(tnz, 14);
186 it->top_nz_[3] = BIT(tnz, 15); 198 top_nz[3] = BIT(tnz, 15);
187 // Top-U 199 // Top-U
188 it->top_nz_[4] = BIT(tnz, 18); 200 top_nz[4] = BIT(tnz, 18);
189 it->top_nz_[5] = BIT(tnz, 19); 201 top_nz[5] = BIT(tnz, 19);
190 // Top-V 202 // Top-V
191 it->top_nz_[6] = BIT(tnz, 22); 203 top_nz[6] = BIT(tnz, 22);
192 it->top_nz_[7] = BIT(tnz, 23); 204 top_nz[7] = BIT(tnz, 23);
193 // DC 205 // DC
194 it->top_nz_[8] = BIT(tnz, 24); 206 top_nz[8] = BIT(tnz, 24);
195 207
196 // left-Y 208 // left-Y
197 it->left_nz_[0] = BIT(lnz, 3); 209 left_nz[0] = BIT(lnz, 3);
198 it->left_nz_[1] = BIT(lnz, 7); 210 left_nz[1] = BIT(lnz, 7);
199 it->left_nz_[2] = BIT(lnz, 11); 211 left_nz[2] = BIT(lnz, 11);
200 it->left_nz_[3] = BIT(lnz, 15); 212 left_nz[3] = BIT(lnz, 15);
201 // left-U 213 // left-U
202 it->left_nz_[4] = BIT(lnz, 17); 214 left_nz[4] = BIT(lnz, 17);
203 it->left_nz_[5] = BIT(lnz, 19); 215 left_nz[5] = BIT(lnz, 19);
204 // left-V 216 // left-V
205 it->left_nz_[6] = BIT(lnz, 21); 217 left_nz[6] = BIT(lnz, 21);
206 it->left_nz_[7] = BIT(lnz, 23); 218 left_nz[7] = BIT(lnz, 23);
207 // left-DC is special, iterated separately 219 // left-DC is special, iterated separately
208 } 220 }
209 221
210 void VP8IteratorBytesToNz(VP8EncIterator* const it) { 222 void VP8IteratorBytesToNz(VP8EncIterator* const it) {
211 uint32_t nz = 0; 223 uint32_t nz = 0;
224 const int* const top_nz = it->top_nz_;
225 const int* const left_nz = it->left_nz_;
212 // top 226 // top
213 nz |= (it->top_nz_[0] << 12) | (it->top_nz_[1] << 13); 227 nz |= (top_nz[0] << 12) | (top_nz[1] << 13);
214 nz |= (it->top_nz_[2] << 14) | (it->top_nz_[3] << 15); 228 nz |= (top_nz[2] << 14) | (top_nz[3] << 15);
215 nz |= (it->top_nz_[4] << 18) | (it->top_nz_[5] << 19); 229 nz |= (top_nz[4] << 18) | (top_nz[5] << 19);
216 nz |= (it->top_nz_[6] << 22) | (it->top_nz_[7] << 23); 230 nz |= (top_nz[6] << 22) | (top_nz[7] << 23);
217 nz |= (it->top_nz_[8] << 24); // we propagate the _top_ bit, esp. for intra4 231 nz |= (top_nz[8] << 24); // we propagate the _top_ bit, esp. for intra4
218 // left 232 // left
219 nz |= (it->left_nz_[0] << 3) | (it->left_nz_[1] << 7); 233 nz |= (left_nz[0] << 3) | (left_nz[1] << 7);
220 nz |= (it->left_nz_[2] << 11); 234 nz |= (left_nz[2] << 11);
221 nz |= (it->left_nz_[4] << 17) | (it->left_nz_[6] << 21); 235 nz |= (left_nz[4] << 17) | (left_nz[6] << 21);
222 236
223 *it->nz_ = nz; 237 *it->nz_ = nz;
224 } 238 }
225 239
226 #undef BIT 240 #undef BIT
227 241
228 //------------------------------------------------------------------------------ 242 //------------------------------------------------------------------------------
229 // Advance to the next position, doing the bookeeping. 243 // Advance to the next position, doing the bookeeping.
230 244
231 int VP8IteratorNext(VP8EncIterator* const it, 245 int VP8IteratorNext(VP8EncIterator* const it,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 it->nz_ = enc->nz_; 281 it->nz_ = enc->nz_;
268 InitLeft(it); 282 InitLeft(it);
269 } 283 }
270 return (0 < --it->done_); 284 return (0 < --it->done_);
271 } 285 }
272 286
273 //------------------------------------------------------------------------------ 287 //------------------------------------------------------------------------------
274 // Helper function to set mode properties 288 // Helper function to set mode properties
275 289
276 void VP8SetIntra16Mode(const VP8EncIterator* const it, int mode) { 290 void VP8SetIntra16Mode(const VP8EncIterator* const it, int mode) {
291 uint8_t* preds = it->preds_;
277 int y; 292 int y;
278 uint8_t* preds = it->preds_;
279 for (y = 0; y < 4; ++y) { 293 for (y = 0; y < 4; ++y) {
280 memset(preds, mode, 4); 294 memset(preds, mode, 4);
281 preds += it->enc_->preds_w_; 295 preds += it->enc_->preds_w_;
282 } 296 }
283 it->mb_->type_ = 1; 297 it->mb_->type_ = 1;
284 } 298 }
285 299
286 void VP8SetIntra4Mode(const VP8EncIterator* const it, int modes[16]) { 300 void VP8SetIntra4Mode(const VP8EncIterator* const it, const uint8_t* modes) {
287 int x, y;
288 uint8_t* preds = it->preds_; 301 uint8_t* preds = it->preds_;
289 for (y = 0; y < 4; ++y) { 302 int y;
290 for (x = 0; x < 4; ++x) { 303 for (y = 4; y > 0; --y) {
291 preds[x] = modes[x + y * 4]; 304 memcpy(preds, modes, 4 * sizeof(*modes));
292 }
293 preds += it->enc_->preds_w_; 305 preds += it->enc_->preds_w_;
306 modes += 4;
294 } 307 }
295 it->mb_->type_ = 0; 308 it->mb_->type_ = 0;
296 } 309 }
297 310
298 void VP8SetIntraUVMode(const VP8EncIterator* const it, int mode) { 311 void VP8SetIntraUVMode(const VP8EncIterator* const it, int mode) {
299 it->mb_->uv_mode_ = mode; 312 it->mb_->uv_mode_ = mode;
300 } 313 }
301 314
302 void VP8SetSkip(const VP8EncIterator* const it, int skip) { 315 void VP8SetSkip(const VP8EncIterator* const it, int skip) {
303 it->mb_->skip_ = skip; 316 it->mb_->skip_ = skip;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 // Array to record the position of the top sample to pass to the prediction 353 // Array to record the position of the top sample to pass to the prediction
341 // functions in dsp.c. 354 // functions in dsp.c.
342 static const uint8_t VP8TopLeftI4[16] = { 355 static const uint8_t VP8TopLeftI4[16] = {
343 17, 21, 25, 29, 356 17, 21, 25, 29,
344 13, 17, 21, 25, 357 13, 17, 21, 25,
345 9, 13, 17, 21, 358 9, 13, 17, 21,
346 5, 9, 13, 17 359 5, 9, 13, 17
347 }; 360 };
348 361
349 void VP8IteratorStartI4(VP8EncIterator* const it) { 362 void VP8IteratorStartI4(VP8EncIterator* const it) {
350 VP8Encoder* const enc = it->enc_; 363 const VP8Encoder* const enc = it->enc_;
351 int i; 364 int i;
352 365
353 it->i4_ = 0; // first 4x4 sub-block 366 it->i4_ = 0; // first 4x4 sub-block
354 it->i4_top_ = it->i4_boundary_ + VP8TopLeftI4[0]; 367 it->i4_top_ = it->i4_boundary_ + VP8TopLeftI4[0];
355 368
356 // Import the boundary samples 369 // Import the boundary samples
357 for (i = 0; i < 17; ++i) { // left 370 for (i = 0; i < 17; ++i) { // left
358 it->i4_boundary_[i] = enc->y_left_[15 - i]; 371 it->i4_boundary_[i] = enc->y_left_[15 - i];
359 } 372 }
360 for (i = 0; i < 16; ++i) { // top 373 for (i = 0; i < 16; ++i) { // top
(...skipping 25 matching lines...) Expand all
386 if ((it->i4_ & 3) != 3) { // if not on the right sub-blocks #3, #7, #11, #15 399 if ((it->i4_ & 3) != 3) { // if not on the right sub-blocks #3, #7, #11, #15
387 for (i = 0; i <= 2; ++i) { // store future left samples 400 for (i = 0; i <= 2; ++i) { // store future left samples
388 top[i] = blk[3 + (2 - i) * BPS]; 401 top[i] = blk[3 + (2 - i) * BPS];
389 } 402 }
390 } else { // else replicate top-right samples, as says the specs. 403 } else { // else replicate top-right samples, as says the specs.
391 for (i = 0; i <= 3; ++i) { 404 for (i = 0; i <= 3; ++i) {
392 top[i] = top[i + 4]; 405 top[i] = top[i + 4];
393 } 406 }
394 } 407 }
395 // move pointers to next sub-block 408 // move pointers to next sub-block
396 it->i4_++; 409 ++it->i4_;
397 if (it->i4_ == 16) { // we're done 410 if (it->i4_ == 16) { // we're done
398 return 0; 411 return 0;
399 } 412 }
400 413
401 it->i4_top_ = it->i4_boundary_ + VP8TopLeftI4[it->i4_]; 414 it->i4_top_ = it->i4_boundary_ + VP8TopLeftI4[it->i4_];
402 return 1; 415 return 1;
403 } 416 }
404 417
405 //------------------------------------------------------------------------------ 418 //------------------------------------------------------------------------------
406 419
407 #if defined(__cplusplus) || defined(c_plusplus) 420 #if defined(__cplusplus) || defined(c_plusplus)
408 } // extern "C" 421 } // extern "C"
409 #endif 422 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698