1/* 2 ** Copyright 2003-2010, VisualOn, Inc. 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17/******************************************************************************* 18 File: mem_align.c 19 20 Content: Memory alloc alignments functions 21 22*******************************************************************************/ 23 24 25#include "mem_align.h" 26#ifdef _MSC_VER 27#include <stddef.h> 28#else 29#include <stdint.h> 30#endif 31 32/***************************************************************************** 33* 34* function name: mem_malloc 35* description: malloc the alignments memory 36* returns: the point of the memory 37* 38**********************************************************************************/ 39void * 40mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID) 41{ 42 int ret; 43 unsigned char *mem_ptr; 44 VO_MEM_INFO MemInfo; 45 46 if (!alignment) { 47 48 MemInfo.Flag = 0; 49 MemInfo.Size = size + 1; 50 ret = pMemop->Alloc(CodecID, &MemInfo); 51 if(ret != 0) 52 return 0; 53 mem_ptr = (unsigned char *)MemInfo.VBuffer; 54 55 pMemop->Set(CodecID, mem_ptr, 0, size + 1); 56 57 *mem_ptr = (unsigned char)1; 58 59 return ((void *)(mem_ptr+1)); 60 } else { 61 unsigned char *tmp; 62 63 MemInfo.Flag = 0; 64 MemInfo.Size = size + alignment; 65 ret = pMemop->Alloc(CodecID, &MemInfo); 66 if(ret != 0) 67 return 0; 68 69 tmp = (unsigned char *)MemInfo.VBuffer; 70 71 pMemop->Set(CodecID, tmp, 0, size + alignment); 72 73 mem_ptr = 74 (unsigned char *) ((intptr_t) (tmp + alignment - 1) & 75 (~((intptr_t) (alignment - 1)))); 76 77 if (mem_ptr == tmp) 78 mem_ptr += alignment; 79 80 *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp); 81 82 return ((void *)mem_ptr); 83 } 84 85 return(0); 86} 87 88 89/***************************************************************************** 90* 91* function name: mem_free 92* description: free the memory 93* 94*******************************************************************************/ 95void 96mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID) 97{ 98 99 unsigned char *ptr; 100 101 if (mem_ptr == 0) 102 return; 103 104 ptr = mem_ptr; 105 106 ptr -= *(ptr - 1); 107 108 pMemop->Free(CodecID, ptr); 109} 110 111 112 113