Include <math.h> for M_PI.
[daala.git] / src / internal.h
1 /*Daala video codec
2 Copyright (c) 2006-2010 Daala project contributors.  All rights reserved.
3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are met:
6
7 - Redistributions of source code must retain the above copyright notice, this
8   list of conditions and the following disclaimer.
9
10 - Redistributions in binary form must reproduce the above copyright notice,
11   this list of conditions and the following disclaimer in the documentation
12   and/or other materials provided with the distribution.
13
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/
24
25 #if !defined(_internal_H)
26 # define _internal_H (1)
27 # include <limits.h>
28 # include "../include/daala/codec.h"
29 # include "odintrin.h"
30
31 # if defined(_MSC_VER)
32 #  pragma warning(disable:4554 4799)
33 #  define _USE_MATH_DEFINES
34 # elif OD_GNUC_PREREQ(4,2)
35 #  pragma GCC diagnostic ignored "-Wparentheses"
36 #  pragma GCC diagnostic ignored "-Wlong-long"
37 #  pragma GCC diagnostic ignored "-Woverlength-strings"
38 # endif
39
40 # define OD_VERSION_MAJOR (0)
41 # define OD_VERSION_MINOR (0)
42 # define OD_VERSION_SUB   (0)
43
44 # define OD_VENDOR_STRING "Xiph's experimental encoder library " __DATE__
45
46 /*Constants for the packet state machine common between encoder and decoder.*/
47
48 /*Next packet to emit/read: Codec info header.*/
49 #define OD_PACKET_INFO_HDR    (-3)
50 /*Next packet to emit/read: Comment header.*/
51 #define OD_PACKET_COMMENT_HDR (-2)
52 /*Next packet to emit/read: Codec setup header.*/
53 #define OD_PACKET_SETUP_HDR   (-1)
54 /*Next more packets to emit/read.*/
55 #define OD_PACKET_DONE        (INT_MAX)
56
57 /*Smallest blocks are 4x4*/
58 #define OD_LOG_BSIZE0 (2)
59 /*There are 3 block sizes total (4x4, 8x8, 16x16).*/
60 #define OD_NBSIZES    (3)
61 /*The largest block size.*/
62 #define OD_BSIZE_MAX  (1<<OD_LOG_BSIZE0+OD_NBSIZES-1)
63
64
65
66 # if defined(OD_ENABLE_ASSERTIONS)
67 #  include <stdio.h>
68 #  include <stdlib.h>
69 #  if OD_GNUC_PREREQ(2,5)
70 __attribute__((noreturn))
71 #  endif
72 void od_fatal_impl(const char *_str,const char *_file,int _line);
73
74 #  define OD_FATAL(_str) (od_fatal_impl(_str,__FILE__,__LINE__))
75
76 #  define OD_ASSERT(_cond) \
77   do{ \
78     if(!(_cond)){ \
79       OD_FATAL("assertion failed: " #_cond); \
80     } \
81   } \
82   while(0)
83
84 #  define OD_ASSERT2(_cond,_message) \
85   do{ \
86     if(!(_cond)){ \
87       OD_FATAL("assertion failed: " #_cond "\n" _message); \
88     } \
89   } \
90   while(0)
91
92 # else
93 #  define OD_ASSERT(_cond)
94 #  define OD_ASSERT2(_cond,_message)
95 # endif
96
97 /*Currently this structure is only in Tremor, and is read-only.*/
98 typedef struct oggbyte_buffer oggbyte_buffer;
99
100 /*Simple libogg1-style buffer.*/
101 struct oggbyte_buffer{
102   unsigned char *buf;
103   unsigned char *ptr;
104   long           storage;
105 };
106
107 /*Encoding functions.*/
108 void oggbyte_writeinit(oggbyte_buffer *_b);
109 void oggbyte_writetrunc(oggbyte_buffer *_b,long _bytes);
110 void oggbyte_write1(oggbyte_buffer *_b,unsigned _value);
111 void oggbyte_write4(oggbyte_buffer *_b,ogg_uint32_t _value);
112 void oggbyte_writecopy(oggbyte_buffer *_b,const void *_source,long _bytes);
113 void oggbyte_writeclear(oggbyte_buffer *_b);
114 /*Decoding functions.*/
115 void oggbyte_readinit(oggbyte_buffer *_b,unsigned char *_buf,long _bytes);
116 int oggbyte_look1(oggbyte_buffer *_b);
117 int oggbyte_look4(oggbyte_buffer *_b,ogg_uint32_t *_val);
118 void oggbyte_adv1(oggbyte_buffer *_b);
119 void oggbyte_adv4(oggbyte_buffer *_b);
120 int oggbyte_read1(oggbyte_buffer *_b);
121 int oggbyte_read4(oggbyte_buffer *_b,ogg_uint32_t *_val);
122 /*Shared functions.*/
123 void oggbyte_reset(oggbyte_buffer *_b);
124 long oggbyte_bytes(oggbyte_buffer *_b);
125 unsigned char *oggbyte_get_buffer(oggbyte_buffer *_b);
126
127 int od_ilog(ogg_uint32_t _v);
128 void **od_malloc_2d(size_t _height,size_t _width,size_t _sz);
129 void **od_calloc_2d(size_t _height,size_t _width,size_t _sz);
130 void od_free_2d(void *_ptr);
131
132 # define OD_DIVU_DMAX (32)
133
134 extern ogg_uint32_t OD_DIVU_SMALL_CONSTS[OD_DIVU_DMAX][2];
135
136 /*Translate unsigned division by small divisors into multiplications.*/
137 # define OD_DIVU_SMALL(_x,_d) \
138   ((ogg_uint32_t)(OD_DIVU_SMALL_CONSTS[(_d)-1][0]* \
139   (unsigned long long)(_x)+OD_DIVU_SMALL_CONSTS[(_d)-1][1]>>32)>> \
140   OD_ILOG(_d)-1)
141
142 #endif