|
Blender
V2.59
|
00001 /* 00002 * $Id: endian.c 35249 2011-02-27 20:43:42Z jesterking $ 00003 * 00004 * This is external code. Streams bytes to output depending on the 00005 * endianness of the system. 00006 * 00007 * ***** BEGIN GPL LICENSE BLOCK ***** 00008 * 00009 * This program is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU General Public License 00011 * as published by the Free Software Foundation; either version 2 00012 * of the License, or (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software Foundation, 00021 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00022 * 00023 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. 00024 * All rights reserved. 00025 * 00026 * The Original Code is: all of this file. 00027 * 00028 * Contributor(s): none yet. 00029 * 00030 * ***** END GPL LICENSE BLOCK ***** 00031 * 00032 */ 00033 00039 #include <stdlib.h> 00040 #include <string.h> 00041 #include <stdio.h> 00042 #include "AVI_avi.h" 00043 #include "endian.h" 00044 #include "avi_intern.h" 00045 00046 #if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__) 00047 #define WORDS_BIGENDIAN 00048 #endif 00049 00050 #ifdef WORDS_BIGENDIAN 00051 static void invert (int *num) { 00052 int new=0,i,j; 00053 00054 for (j=0; j < 4; j++) { 00055 for (i=0; i<8; i++) { 00056 new |= ((*num>>(j*8+i))&1)<<((3-j)*8+i); 00057 } 00058 } 00059 00060 *num = new; 00061 } 00062 00063 static void sinvert (short int *num) { 00064 short int new=0; 00065 int i,j; 00066 00067 for (j=0; j < 2; j++) { 00068 for (i=0; i<8; i++) { 00069 new |= ((*num>>(j*8+i))&1)<<((1-j)*8+i); 00070 } 00071 } 00072 00073 *num = new; 00074 } 00075 00076 static void Ichunk (AviChunk *chunk) { 00077 invert (&chunk->fcc); 00078 invert (&chunk->size); 00079 } 00080 #endif 00081 00082 #ifdef WORDS_BIGENDIAN 00083 static void Ilist (AviList *list){ 00084 invert (&list->fcc); 00085 invert (&list->size); 00086 invert (&list->ids); 00087 } 00088 00089 static void Imainh (AviMainHeader *mainh) { 00090 invert (&mainh->fcc); 00091 invert (&mainh->size); 00092 invert (&mainh->MicroSecPerFrame); 00093 invert (&mainh->MaxBytesPerSec); 00094 invert (&mainh->PaddingGranularity); 00095 invert (&mainh->Flags); 00096 invert (&mainh->TotalFrames); 00097 invert (&mainh->InitialFrames); 00098 invert (&mainh->Streams); 00099 invert (&mainh->SuggestedBufferSize); 00100 invert (&mainh->Width); 00101 invert (&mainh->Height); 00102 invert (&mainh->Reserved[0]); 00103 invert (&mainh->Reserved[1]); 00104 invert (&mainh->Reserved[2]); 00105 invert (&mainh->Reserved[3]); 00106 } 00107 00108 static void Istreamh (AviStreamHeader *streamh) { 00109 invert (&streamh->fcc); 00110 invert (&streamh->size); 00111 invert (&streamh->Type); 00112 invert (&streamh->Handler); 00113 invert (&streamh->Flags); 00114 sinvert (&streamh->Priority); 00115 sinvert (&streamh->Language); 00116 invert (&streamh->InitialFrames); 00117 invert (&streamh->Scale); 00118 invert (&streamh->Rate); 00119 invert (&streamh->Start); 00120 invert (&streamh->Length); 00121 invert (&streamh->SuggestedBufferSize); 00122 invert (&streamh->Quality); 00123 invert (&streamh->SampleSize); 00124 sinvert (&streamh->left); 00125 sinvert (&streamh->right); 00126 sinvert (&streamh->top); 00127 sinvert (&streamh->bottom); 00128 } 00129 00130 static void Ibitmaph (AviBitmapInfoHeader *bitmaph) { 00131 invert (&bitmaph->fcc); 00132 invert (&bitmaph->size); 00133 invert (&bitmaph->Size); 00134 invert (&bitmaph->Width); 00135 invert (&bitmaph->Height); 00136 sinvert (&bitmaph->Planes); 00137 sinvert (&bitmaph->BitCount); 00138 invert (&bitmaph->Compression); 00139 invert (&bitmaph->SizeImage); 00140 invert (&bitmaph->XPelsPerMeter); 00141 invert (&bitmaph->YPelsPerMeter); 00142 invert (&bitmaph->ClrUsed); 00143 invert (&bitmaph->ClrImportant); 00144 } 00145 00146 static void Imjpegu (AviMJPEGUnknown *mjpgu) { 00147 invert (&mjpgu->a); 00148 invert (&mjpgu->b); 00149 invert (&mjpgu->c); 00150 invert (&mjpgu->d); 00151 invert (&mjpgu->e); 00152 invert (&mjpgu->f); 00153 invert (&mjpgu->g); 00154 } 00155 00156 static void Iindexe (AviIndexEntry *indexe) { 00157 invert (&indexe->ChunkId); 00158 invert (&indexe->Flags); 00159 invert (&indexe->Offset); 00160 invert (&indexe->Size); 00161 } 00162 #endif /* WORDS_BIGENDIAN */ 00163 00164 void awrite (AviMovie *movie, void *datain, int block, int size, FILE *fp, int type) { 00165 #ifdef WORDS_BIGENDIAN 00166 void *data; 00167 00168 data = MEM_mallocN (size, "avi endian"); 00169 00170 memcpy (data, datain, size); 00171 00172 switch (type) { 00173 case AVI_RAW: 00174 fwrite (data, block, size, fp); 00175 break; 00176 case AVI_CHUNK: 00177 Ichunk ((AviChunk *) data); 00178 fwrite (data, block, size, fp); 00179 break; 00180 case AVI_LIST: 00181 Ilist ((AviList *) data); 00182 fwrite (data, block, size, fp); 00183 break; 00184 case AVI_MAINH: 00185 Imainh ((AviMainHeader *) data); 00186 fwrite (data, block, size, fp); 00187 break; 00188 case AVI_STREAMH: 00189 Istreamh ((AviStreamHeader *) data); 00190 fwrite (data, block, size, fp); 00191 break; 00192 case AVI_BITMAPH: 00193 Ibitmaph ((AviBitmapInfoHeader *) data); 00194 if (size==sizeof(AviBitmapInfoHeader) + sizeof(AviMJPEGUnknown)) { 00195 Imjpegu((AviMJPEGUnknown*)((char*)data+sizeof(AviBitmapInfoHeader))); 00196 } 00197 fwrite (data, block, size, fp); 00198 break; 00199 case AVI_MJPEGU: 00200 Imjpegu ((AviMJPEGUnknown *) data); 00201 fwrite (data, block, size, fp); 00202 break; 00203 case AVI_INDEXE: 00204 Iindexe ((AviIndexEntry *) data); 00205 fwrite (data, block, size, fp); 00206 break; 00207 default: 00208 break; 00209 } 00210 00211 MEM_freeN (data); 00212 #else /* WORDS_BIGENDIAN */ 00213 (void)movie; /* unused */ 00214 (void)type; /* unused */ 00215 fwrite (datain, block, size, fp); 00216 #endif /* WORDS_BIGENDIAN */ 00217 }