1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/* 2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Copyright 2003-2010, VisualOn, Inc. 3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** 4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Licensed under the Apache License, Version 2.0 (the "License"); 5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** you may not use this file except in compliance with the License. 6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** You may obtain a copy of the License at 7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** 8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** http://www.apache.org/licenses/LICENSE-2.0 9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** 10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** Unless required by applicable law or agreed to in writing, software 11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** distributed under the License is distributed on an "AS IS" BASIS, 12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** See the License for the specific language governing permissions and 14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ** limitations under the License. 15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong */ 16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/******************************************************************************* 185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen File: mem_align.c 19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Content: Memory alloc alignments functions 21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/ 23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#include "mem_align.h" 26417f62c84261ea17e17a011b1e9706eb997a6ba1Martin Storsjo#ifdef _MSC_VER 275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#include <stddef.h> 28417f62c84261ea17e17a011b1e9706eb997a6ba1Martin Storsjo#else 295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen#include <stdint.h> 30417f62c84261ea17e17a011b1e9706eb997a6ba1Martin Storsjo#endif 31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: mem_malloc 35b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard* description: malloc the alignments memory 36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns: the point of the memory 37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid * 40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongmem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID) 41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen int ret; 435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen unsigned char *mem_ptr; 445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen VO_MEM_INFO MemInfo; 45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (!alignment) { 47956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen MemInfo.Flag = 0; 495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen MemInfo.Size = size + 1; 505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ret = pMemop->Alloc(CodecID, &MemInfo); 515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(ret != 0) 525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return 0; 535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen mem_ptr = (unsigned char *)MemInfo.VBuffer; 54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen pMemop->Set(CodecID, mem_ptr, 0, size + 1); 56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *mem_ptr = (unsigned char)1; 58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return ((void *)(mem_ptr+1)); 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } else { 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen unsigned char *tmp; 62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen MemInfo.Flag = 0; 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen MemInfo.Size = size + alignment; 655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ret = pMemop->Alloc(CodecID, &MemInfo); 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(ret != 0) 675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return 0; 68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = (unsigned char *)MemInfo.VBuffer; 70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen pMemop->Set(CodecID, tmp, 0, size + alignment); 72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen mem_ptr = 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen (unsigned char *) ((intptr_t) (tmp + alignment - 1) & 755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen (~((intptr_t) (alignment - 1)))); 76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (mem_ptr == tmp) 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen mem_ptr += alignment; 79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp); 81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return ((void *)mem_ptr); 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return(0); 86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/***************************************************************************** 90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: mem_free 92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: free the memory 93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/ 95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid 96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongmem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID) 97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen unsigned char *ptr; 100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (mem_ptr == 0) 1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ptr = mem_ptr; 105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ptr -= *(ptr - 1); 107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen pMemop->Free(CodecID, ptr); 109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 113