Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/libtheora/internal.c
9896 views
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 *
10
* https://www.xiph.org/ *
11
* *
12
********************************************************************
13
14
function:
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
/*Initialize the array.*/
135
if(ret!=NULL){
136
size_t i;
137
void **p;
138
char *datptr;
139
p=(void **)ret;
140
i=_height;
141
for(datptr=ret+colsz;i-->0;p++,datptr+=rowsz)*p=(void *)datptr;
142
}
143
return (void **)ret;
144
}
145
146
void **oc_calloc_2d(size_t _height,size_t _width,size_t _sz){
147
size_t colsz;
148
size_t rowsz;
149
size_t datsz;
150
char *ret;
151
colsz=_height*sizeof(void *);
152
rowsz=_sz*_width;
153
datsz=rowsz*_height;
154
/*Alloc array and row pointers.*/
155
ret=(char *)_ogg_calloc(datsz+colsz,1);
156
/*Initialize the array.*/
157
if(ret!=NULL){
158
size_t i;
159
void **p;
160
char *datptr;
161
p=(void **)ret;
162
i=_height;
163
for(datptr=ret+colsz;i-->0;p++,datptr+=rowsz)*p=(void *)datptr;
164
}
165
return (void **)ret;
166
}
167
168
void oc_free_2d(void *_ptr){
169
_ogg_free(_ptr);
170
}
171
172
/*Fills in a Y'CbCr buffer with a pointer to the image data in the first
173
buffer, but with the opposite vertical orientation.
174
_dst: The destination buffer.
175
This can be the same as _src.
176
_src: The source buffer.*/
177
void oc_ycbcr_buffer_flip(th_ycbcr_buffer _dst,
178
const th_ycbcr_buffer _src){
179
int pli;
180
for(pli=0;pli<3;pli++){
181
_dst[pli].width=_src[pli].width;
182
_dst[pli].height=_src[pli].height;
183
_dst[pli].stride=-_src[pli].stride;
184
_dst[pli].data=_src[pli].data
185
+(1-_dst[pli].height)*(ptrdiff_t)_dst[pli].stride;
186
}
187
}
188
189
const char *th_version_string(void){
190
return OC_VENDOR_STRING;
191
}
192
193
ogg_uint32_t th_version_number(void){
194
return (TH_VERSION_MAJOR<<16)+(TH_VERSION_MINOR<<8)+TH_VERSION_SUB;
195
}
196
197
/*Determines the packet type.
198
Note that this correctly interprets a 0-byte packet as a video data packet.
199
Return: 1 for a header packet, 0 for a data packet.*/
200
int th_packet_isheader(ogg_packet *_op){
201
return _op->bytes>0?_op->packet[0]>>7:0;
202
}
203
204
/*Determines the frame type of a video data packet.
205
Note that this correctly interprets a 0-byte packet as a delta frame.
206
Return: 1 for a key frame, 0 for a delta frame, and -1 for a header
207
packet.*/
208
int th_packet_iskeyframe(ogg_packet *_op){
209
return _op->bytes<=0?0:_op->packet[0]&0x80?-1:!(_op->packet[0]&0x40);
210
}
211
212