mem_align.c revision b676a05348e4c516fa8b57e33b10548e6142c3f8
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 27/***************************************************************************** 28* 29* function name: mem_malloc 30* description: malloc the alignments memory 31* returns: the point of the memory 32* 33**********************************************************************************/ 34void * 35mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID) 36{ 37 int ret; 38 unsigned char *mem_ptr; 39 VO_MEM_INFO MemInfo; 40 41 if (!alignment) { 42 43 MemInfo.Flag = 0; 44 MemInfo.Size = size + 1; 45 ret = pMemop->Alloc(CodecID, &MemInfo); 46 if(ret != 0) 47 return 0; 48 mem_ptr = (unsigned char *)MemInfo.VBuffer; 49 50 pMemop->Set(CodecID, mem_ptr, 0, size + 1); 51 52 *mem_ptr = (unsigned char)1; 53 54 return ((void *)(mem_ptr+1)); 55 } else { 56 unsigned char *tmp; 57 58 MemInfo.Flag = 0; 59 MemInfo.Size = size + alignment; 60 ret = pMemop->Alloc(CodecID, &MemInfo); 61 if(ret != 0) 62 return 0; 63 64 tmp = (unsigned char *)MemInfo.VBuffer; 65 66 pMemop->Set(CodecID, tmp, 0, size + alignment); 67 68 mem_ptr = 69 (unsigned char *) ((unsigned int) (tmp + alignment - 1) & 70 (~((unsigned int) (alignment - 1)))); 71 72 if (mem_ptr == tmp) 73 mem_ptr += alignment; 74 75 *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp); 76 77 return ((void *)mem_ptr); 78 } 79 80 return(0); 81} 82 83 84/***************************************************************************** 85* 86* function name: mem_free 87* description: free the memory 88* 89*******************************************************************************/ 90void 91mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID) 92{ 93 94 unsigned char *ptr; 95 96 if (mem_ptr == 0) 97 return; 98 99 ptr = mem_ptr; 100 101 ptr -= *(ptr - 1); 102 103 pMemop->Free(CodecID, ptr); 104} 105 106 107 108