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