| |
1 /******************************************************************** |
| |
2 * * |
| |
3 * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * |
| |
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
| |
5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
| |
6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
| |
7 * * |
| |
8 * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * |
| |
9 * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * |
| |
10 * * |
| |
11 ******************************************************************** |
| |
12 |
| |
13 function: |
| |
14 last mod: $Id: internal.c 17506 2010-10-13 02:52:41Z tterribe $ |
| |
15 |
| |
16 ********************************************************************/ |
| |
17 |
| |
18 #include <stdlib.h> |
| |
19 #include <limits.h> |
| |
20 #include <string.h> |
| |
21 #include "internal.h" |
| |
22 |
| |
23 |
| |
24 |
| |
25 /*A map from the index in the zig zag scan to the coefficient number in a |
| |
26 block. |
| |
27 All zig zag indices beyond 63 are sent to coefficient 64, so that zero runs |
| |
28 past the end of a block in bogus streams get mapped to a known location.*/ |
| |
29 const unsigned char OC_FZIG_ZAG[128]={ |
| |
30 0, 1, 8,16, 9, 2, 3,10, |
| |
31 17,24,32,25,18,11, 4, 5, |
| |
32 12,19,26,33,40,48,41,34, |
| |
33 27,20,13, 6, 7,14,21,28, |
| |
34 35,42,49,56,57,50,43,36, |
| |
35 29,22,15,23,30,37,44,51, |
| |
36 58,59,52,45,38,31,39,46, |
| |
37 53,60,61,54,47,55,62,63, |
| |
38 64,64,64,64,64,64,64,64, |
| |
39 64,64,64,64,64,64,64,64, |
| |
40 64,64,64,64,64,64,64,64, |
| |
41 64,64,64,64,64,64,64,64, |
| |
42 64,64,64,64,64,64,64,64, |
| |
43 64,64,64,64,64,64,64,64, |
| |
44 64,64,64,64,64,64,64,64, |
| |
45 64,64,64,64,64,64,64,64 |
| |
46 }; |
| |
47 |
| |
48 /*A map from the coefficient number in a block to its index in the zig zag |
| |
49 scan.*/ |
| |
50 const unsigned char OC_IZIG_ZAG[64]={ |
| |
51 0, 1, 5, 6,14,15,27,28, |
| |
52 2, 4, 7,13,16,26,29,42, |
| |
53 3, 8,12,17,25,30,41,43, |
| |
54 9,11,18,24,31,40,44,53, |
| |
55 10,19,23,32,39,45,52,54, |
| |
56 20,22,33,38,46,51,55,60, |
| |
57 21,34,37,47,50,56,59,61, |
| |
58 35,36,48,49,57,58,62,63 |
| |
59 }; |
| |
60 |
| |
61 /*A map from physical macro block ordering to bitstream macro block |
| |
62 ordering within a super block.*/ |
| |
63 const unsigned char OC_MB_MAP[2][2]={{0,3},{1,2}}; |
| |
64 |
| |
65 /*A list of the indices in the oc_mb.map array that can be valid for each of |
| |
66 the various chroma decimation types.*/ |
| |
67 const unsigned char OC_MB_MAP_IDXS[TH_PF_NFORMATS][12]={ |
| |
68 {0,1,2,3,4,8}, |
| |
69 {0,1,2,3,4,5,8,9}, |
| |
70 {0,1,2,3,4,6,8,10}, |
| |
71 {0,1,2,3,4,5,6,7,8,9,10,11} |
| |
72 }; |
| |
73 |
| |
74 /*The number of indices in the oc_mb.map array that can be valid for each of |
| |
75 the various chroma decimation types.*/ |
| |
76 const unsigned char OC_MB_MAP_NIDXS[TH_PF_NFORMATS]={6,8,8,12}; |
| |
77 |
| |
78 /*The number of extra bits that are coded with each of the DCT tokens. |
| |
79 Each DCT token has some fixed number of additional bits (possibly 0) stored |
| |
80 after the token itself, containing, for example, coefficient magnitude, |
| |
81 sign bits, etc.*/ |
| |
82 const unsigned char OC_DCT_TOKEN_EXTRA_BITS[TH_NDCT_TOKENS]={ |
| |
83 0,0,0,2,3,4,12,3,6, |
| |
84 0,0,0,0, |
| |
85 1,1,1,1,2,3,4,5,6,10, |
| |
86 1,1,1,1,1,3,4, |
| |
87 2,3 |
| |
88 }; |
| |
89 |
| |
90 |
| |
91 |
| |
92 int oc_ilog(unsigned _v){ |
| |
93 int ret; |
| |
94 for(ret=0;_v;ret++)_v>>=1; |
| |
95 return ret; |
| |
96 } |
| |
97 |
| |
98 |
| |
99 |
| |
100 void *oc_aligned_malloc(size_t _sz,size_t _align){ |
| |
101 unsigned char *p; |
| |
102 if(_align-1>UCHAR_MAX||(_align&_align-1)||_sz>~(size_t)0-_align)return NULL; |
| |
103 p=(unsigned char *)_ogg_malloc(_sz+_align); |
| |
104 if(p!=NULL){ |
| |
105 int offs; |
| |
106 offs=((p-(unsigned char *)0)-1&_align-1); |
| |
107 p[offs]=offs; |
| |
108 p+=offs+1; |
| |
109 } |
| |
110 return p; |
| |
111 } |
| |
112 |
| |
113 void oc_aligned_free(void *_ptr){ |
| |
114 unsigned char *p; |
| |
115 p=(unsigned char *)_ptr; |
| |
116 if(p!=NULL){ |
| |
117 int offs; |
| |
118 offs=*--p; |
| |
119 _ogg_free(p-offs); |
| |
120 } |
| |
121 } |
| |
122 |
| |
123 |
| |
124 void **oc_malloc_2d(size_t _height,size_t _width,size_t _sz){ |
| |
125 size_t rowsz; |
| |
126 size_t colsz; |
| |
127 size_t datsz; |
| |
128 char *ret; |
| |
129 colsz=_height*sizeof(void *); |
| |
130 rowsz=_sz*_width; |
| |
131 datsz=rowsz*_height; |
| |
132 /*Alloc array and row pointers.*/ |
| |
133 ret=(char *)_ogg_malloc(datsz+colsz); |
| |
134 if(ret==NULL)return NULL; |
| |
135 /*Initialize the array.*/ |
| |
136 if(ret!=NULL){ |
| |
137 size_t i; |
| |
138 void **p; |
| |
139 char *datptr; |
| |
140 p=(void **)ret; |
| |
141 i=_height; |
| |
142 for(datptr=ret+colsz;i-->0;p++,datptr+=rowsz)*p=(void *)datptr; |
| |
143 } |
| |
144 return (void **)ret; |
| |
145 } |
| |
146 |
| |
147 void **oc_calloc_2d(size_t _height,size_t _width,size_t _sz){ |
| |
148 size_t colsz; |
| |
149 size_t rowsz; |
| |
150 size_t datsz; |
| |
151 char *ret; |
| |
152 colsz=_height*sizeof(void *); |
| |
153 rowsz=_sz*_width; |
| |
154 datsz=rowsz*_height; |
| |
155 /*Alloc array and row pointers.*/ |
| |
156 ret=(char *)_ogg_calloc(datsz+colsz,1); |
| |
157 if(ret==NULL)return NULL; |
| |
158 /*Initialize the array.*/ |
| |
159 if(ret!=NULL){ |
| |
160 size_t i; |
| |
161 void **p; |
| |
162 char *datptr; |
| |
163 p=(void **)ret; |
| |
164 i=_height; |
| |
165 for(datptr=ret+colsz;i-->0;p++,datptr+=rowsz)*p=(void *)datptr; |
| |
166 } |
| |
167 return (void **)ret; |
| |
168 } |
| |
169 |
| |
170 void oc_free_2d(void *_ptr){ |
| |
171 _ogg_free(_ptr); |
| |
172 } |
| |
173 |
| |
174 /*Fills in a Y'CbCr buffer with a pointer to the image data in the first |
| |
175 buffer, but with the opposite vertical orientation. |
| |
176 _dst: The destination buffer. |
| |
177 This can be the same as _src. |
| |
178 _src: The source buffer.*/ |
| |
179 void oc_ycbcr_buffer_flip(th_ycbcr_buffer _dst, |
| |
180 const th_ycbcr_buffer _src){ |
| |
181 int pli; |
| |
182 for(pli=0;pli<3;pli++){ |
| |
183 _dst[pli].width=_src[pli].width; |
| |
184 _dst[pli].height=_src[pli].height; |
| |
185 _dst[pli].stride=-_src[pli].stride; |
| |
186 _dst[pli].data=_src[pli].data |
| |
187 +(1-_dst[pli].height)*(ptrdiff_t)_dst[pli].stride; |
| |
188 } |
| |
189 } |
| |
190 |
| |
191 const char *th_version_string(void){ |
| |
192 return OC_VENDOR_STRING; |
| |
193 } |
| |
194 |
| |
195 ogg_uint32_t th_version_number(void){ |
| |
196 return (TH_VERSION_MAJOR<<16)+(TH_VERSION_MINOR<<8)+TH_VERSION_SUB; |
| |
197 } |
| |
198 |
| |
199 /*Determines the packet type. |
| |
200 Note that this correctly interprets a 0-byte packet as a video data packet. |
| |
201 Return: 1 for a header packet, 0 for a data packet.*/ |
| |
202 int th_packet_isheader(ogg_packet *_op){ |
| |
203 return _op->bytes>0?_op->packet[0]>>7:0; |
| |
204 } |
| |
205 |
| |
206 /*Determines the frame type of a video data packet. |
| |
207 Note that this correctly interprets a 0-byte packet as a delta frame. |
| |
208 Return: 1 for a key frame, 0 for a delta frame, and -1 for a header |
| |
209 packet.*/ |
| |
210 int th_packet_iskeyframe(ogg_packet *_op){ |
| |
211 return _op->bytes<=0?0:_op->packet[0]&0x80?-1:!(_op->packet[0]&0x40); |
| |
212 } |