OLD | NEW |
1 // Copyright 2011 Google Inc. All Rights Reserved. | 1 // Copyright 2011 Google Inc. All Rights Reserved. |
2 // | 2 // |
3 // Use of this source code is governed by a BSD-style license | 3 // Use of this source code is governed by a BSD-style license |
4 // that can be found in the COPYING file in the root of the source | 4 // that can be found in the COPYING file in the root of the source |
5 // tree. An additional intellectual property rights grant can be found | 5 // tree. An additional intellectual property rights grant can be found |
6 // in the file PATENTS. All contributing project authors may | 6 // in the file PATENTS. All contributing project authors may |
7 // be found in the AUTHORS file in the root of the source tree. | 7 // be found in the AUTHORS file in the root of the source tree. |
8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
9 // | 9 // |
10 // Cost tables for level and modes | 10 // Cost tables for level and modes |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 } | 274 } |
275 } | 275 } |
276 } | 276 } |
277 return R; | 277 return R; |
278 } | 278 } |
279 | 279 |
280 | 280 |
281 //------------------------------------------------------------------------------ | 281 //------------------------------------------------------------------------------ |
282 // Recording of token probabilities. | 282 // Recording of token probabilities. |
283 | 283 |
284 // Record proba context used | |
285 static int Record(int bit, proba_t* const stats) { | |
286 proba_t p = *stats; | |
287 if (p >= 0xffff0000u) { // an overflow is inbound. | |
288 p = ((p + 1u) >> 1) & 0x7fff7fffu; // -> divide the stats by 2. | |
289 } | |
290 // record bit count (lower 16 bits) and increment total count (upper 16 bits). | |
291 p += 0x00010000u + bit; | |
292 *stats = p; | |
293 return bit; | |
294 } | |
295 | |
296 // We keep the table-free variant around for reference, in case. | 284 // We keep the table-free variant around for reference, in case. |
297 #define USE_LEVEL_CODE_TABLE | 285 #define USE_LEVEL_CODE_TABLE |
298 | 286 |
299 // Simulate block coding, but only record statistics. | 287 // Simulate block coding, but only record statistics. |
300 // Note: no need to record the fixed probas. | 288 // Note: no need to record the fixed probas. |
301 int VP8RecordCoeffs(int ctx, const VP8Residual* const res) { | 289 int VP8RecordCoeffs(int ctx, const VP8Residual* const res) { |
302 int n = res->first; | 290 int n = res->first; |
303 // should be stats[VP8EncBands[n]], but it's equivalent for n=0 or 1 | 291 // should be stats[VP8EncBands[n]], but it's equivalent for n=0 or 1 |
304 proba_t* s = res->stats[n][ctx]; | 292 proba_t* s = res->stats[n][ctx]; |
305 if (res->last < 0) { | 293 if (res->last < 0) { |
306 Record(0, s + 0); | 294 VP8RecordStats(0, s + 0); |
307 return 0; | 295 return 0; |
308 } | 296 } |
309 while (n <= res->last) { | 297 while (n <= res->last) { |
310 int v; | 298 int v; |
311 Record(1, s + 0); // order of record doesn't matter | 299 VP8RecordStats(1, s + 0); // order of record doesn't matter |
312 while ((v = res->coeffs[n++]) == 0) { | 300 while ((v = res->coeffs[n++]) == 0) { |
313 Record(0, s + 1); | 301 VP8RecordStats(0, s + 1); |
314 s = res->stats[VP8EncBands[n]][0]; | 302 s = res->stats[VP8EncBands[n]][0]; |
315 } | 303 } |
316 Record(1, s + 1); | 304 VP8RecordStats(1, s + 1); |
317 if (!Record(2u < (unsigned int)(v + 1), s + 2)) { // v = -1 or 1 | 305 if (!VP8RecordStats(2u < (unsigned int)(v + 1), s + 2)) { // v = -1 or 1 |
318 s = res->stats[VP8EncBands[n]][1]; | 306 s = res->stats[VP8EncBands[n]][1]; |
319 } else { | 307 } else { |
320 v = abs(v); | 308 v = abs(v); |
321 #if !defined(USE_LEVEL_CODE_TABLE) | 309 #if !defined(USE_LEVEL_CODE_TABLE) |
322 if (!Record(v > 4, s + 3)) { | 310 if (!VP8RecordStats(v > 4, s + 3)) { |
323 if (Record(v != 2, s + 4)) | 311 if (VP8RecordStats(v != 2, s + 4)) |
324 Record(v == 4, s + 5); | 312 VP8RecordStats(v == 4, s + 5); |
325 } else if (!Record(v > 10, s + 6)) { | 313 } else if (!VP8RecordStats(v > 10, s + 6)) { |
326 Record(v > 6, s + 7); | 314 VP8RecordStats(v > 6, s + 7); |
327 } else if (!Record((v >= 3 + (8 << 2)), s + 8)) { | 315 } else if (!VP8RecordStats((v >= 3 + (8 << 2)), s + 8)) { |
328 Record((v >= 3 + (8 << 1)), s + 9); | 316 VP8RecordStats((v >= 3 + (8 << 1)), s + 9); |
329 } else { | 317 } else { |
330 Record((v >= 3 + (8 << 3)), s + 10); | 318 VP8RecordStats((v >= 3 + (8 << 3)), s + 10); |
331 } | 319 } |
332 #else | 320 #else |
333 if (v > MAX_VARIABLE_LEVEL) { | 321 if (v > MAX_VARIABLE_LEVEL) { |
334 v = MAX_VARIABLE_LEVEL; | 322 v = MAX_VARIABLE_LEVEL; |
335 } | 323 } |
336 | 324 |
337 { | 325 { |
338 const int bits = VP8LevelCodes[v - 1][1]; | 326 const int bits = VP8LevelCodes[v - 1][1]; |
339 int pattern = VP8LevelCodes[v - 1][0]; | 327 int pattern = VP8LevelCodes[v - 1][0]; |
340 int i; | 328 int i; |
341 for (i = 0; (pattern >>= 1) != 0; ++i) { | 329 for (i = 0; (pattern >>= 1) != 0; ++i) { |
342 const int mask = 2 << i; | 330 const int mask = 2 << i; |
343 if (pattern & 1) Record(!!(bits & mask), s + 3 + i); | 331 if (pattern & 1) VP8RecordStats(!!(bits & mask), s + 3 + i); |
344 } | 332 } |
345 } | 333 } |
346 #endif | 334 #endif |
347 s = res->stats[VP8EncBands[n]][2]; | 335 s = res->stats[VP8EncBands[n]][2]; |
348 } | 336 } |
349 } | 337 } |
350 if (n < 16) Record(0, s + 0); | 338 if (n < 16) VP8RecordStats(0, s + 0); |
351 return 1; | 339 return 1; |
352 } | 340 } |
353 | 341 |
354 //------------------------------------------------------------------------------ | 342 //------------------------------------------------------------------------------ |
OLD | NEW |