PageRenderTime 45ms CodeModel.GetById 13ms app.highlight 26ms RepoModel.GetById 1ms app.codeStats 0ms

/media/libtheora/lib/internal.c

http://github.com/zpao/v8monkey
C | 212 lines | 139 code | 25 blank | 48 comment | 11 complexity | 5f48425cf49794b2e87b73ce99c02e5d MD5 | raw file
  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.*/
 29const 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.*/
 50const 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.*/
 63const 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.*/
 67const 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.*/
 76const 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.*/
 82const 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
 92int oc_ilog(unsigned _v){
 93  int ret;
 94  for(ret=0;_v;ret++)_v>>=1;
 95  return ret;
 96}
 97
 98
 99
100void *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
113void 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
124void **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
147void **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
170void 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.*/
179void 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
191const char *th_version_string(void){
192  return OC_VENDOR_STRING;
193}
194
195ogg_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.*/
202int 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.*/
210int th_packet_iskeyframe(ogg_packet *_op){
211  return _op->bytes<=0?0:_op->packet[0]&0x80?-1:!(_op->packet[0]&0x40);
212}