yuv.h revision 9aea642eefa7a641ab8b89d953251939221d2719
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2010 Google Inc.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This code is licensed under the same terms as WebM:
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  Software License Agreement:  http://www.webmproject.org/license/software/
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// -----------------------------------------------------------------------------
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// inline YUV->RGB conversion function
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Author: Skal (pascal.massimino@gmail.com)
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef WEBP_DECODE_YUV_H_
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define WEBP_DECODE_YUV_H_
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "webp/decode_vp8.h"
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(__cplusplus) || defined(c_plusplus)
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" {
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovenum { YUV_FIX = 16,                // fixed-point precision
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       YUV_RANGE_MIN = -227,        // min value of r/g/b output
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       YUV_RANGE_MAX = 256 + 226    // max value of r/g/b output
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern int16_t VP8kVToR[256], VP8kUToB[256];
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern int32_t VP8kVToG[256], VP8kUToG[256];
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern uint8_t VP8kClip[YUV_RANGE_MAX - YUV_RANGE_MIN];
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline static void VP8YuvToRgb(uint8_t y, uint8_t u, uint8_t v,
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                               uint8_t* const rgb) {
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const int r_off = VP8kVToR[v];
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const int g_off = (VP8kVToG[v] + VP8kUToG[u]) >> YUV_FIX;
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const int b_off = VP8kUToB[u];
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  rgb[0] = VP8kClip[y + r_off - YUV_RANGE_MIN];
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  rgb[1] = VP8kClip[y + g_off - YUV_RANGE_MIN];
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  rgb[2] = VP8kClip[y + b_off - YUV_RANGE_MIN];
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline static void VP8YuvToRgba(int y, int u, int v, uint8_t* const rgba) {
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  VP8YuvToRgb(y, u, v, rgba);
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  rgba[3] = 0xff;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline static void VP8YuvToBgr(uint8_t y, uint8_t u, uint8_t v,
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                               uint8_t* const bgr) {
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const int r_off = VP8kVToR[v];
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const int g_off = (VP8kVToG[v] + VP8kUToG[u]) >> YUV_FIX;
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const int b_off = VP8kUToB[u];
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bgr[0] = VP8kClip[y + b_off - YUV_RANGE_MIN];
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bgr[1] = VP8kClip[y + g_off - YUV_RANGE_MIN];
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bgr[2] = VP8kClip[y + r_off - YUV_RANGE_MIN];
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline static void VP8YuvToBgra(int y, int u, int v, uint8_t* const bgra) {
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  VP8YuvToBgr(y, u, v, bgra);
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bgra[3] = 0xff;
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Must be called before everything, to initialize the tables.
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid VP8YUVInit();
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(__cplusplus) || defined(c_plusplus)
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}    // extern "C"
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif  // WEBP_DECODE_YUV_H_
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov