MSVC: add missing source files.
[L-SMASH.git] / common / multibuf.c
blobbeb709d6dcb05f796d641ac207491c09d3100825
1 /*****************************************************************************
2 * multibuf.c
3 *****************************************************************************
4 * Copyright (C) 2011-2015 L-SMASH project
6 * Authors: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 *****************************************************************************/
21 /* This file is available under an ISC license. */
23 #include "internal.h" /* must be placed first */
25 #include <string.h>
27 lsmash_multiple_buffers_t *lsmash_create_multiple_buffers( uint32_t number_of_buffers, uint32_t buffer_size )
29 if( (uint64_t)number_of_buffers * buffer_size > UINT32_MAX )
30 return NULL;
31 lsmash_multiple_buffers_t *multiple_buffer = lsmash_malloc( sizeof(lsmash_multiple_buffers_t) );
32 if( !multiple_buffer )
33 return NULL;
34 multiple_buffer->buffers = lsmash_malloc( number_of_buffers * buffer_size );
35 if( !multiple_buffer->buffers )
37 lsmash_free( multiple_buffer );
38 return NULL;
40 multiple_buffer->number_of_buffers = number_of_buffers;
41 multiple_buffer->buffer_size = buffer_size;
42 return multiple_buffer;
45 void *lsmash_withdraw_buffer( lsmash_multiple_buffers_t *multiple_buffer, uint32_t buffer_number )
47 if( !multiple_buffer || !buffer_number || buffer_number > multiple_buffer->number_of_buffers )
48 return NULL;
49 return (uint8_t *)multiple_buffer->buffers + (buffer_number - 1) * multiple_buffer->buffer_size;
52 lsmash_multiple_buffers_t *lsmash_resize_multiple_buffers( lsmash_multiple_buffers_t *multiple_buffer, uint32_t buffer_size )
54 if( !multiple_buffer )
55 return NULL;
56 if( buffer_size == multiple_buffer->buffer_size )
57 return multiple_buffer;
58 if( (uint64_t)multiple_buffer->number_of_buffers * buffer_size > UINT32_MAX )
59 return NULL;
60 uint8_t *temp;
61 if( buffer_size > multiple_buffer->buffer_size )
63 temp = lsmash_realloc( multiple_buffer->buffers, multiple_buffer->number_of_buffers * buffer_size );
64 if( !temp )
65 return NULL;
66 for( uint32_t i = multiple_buffer->number_of_buffers - 1; i ; i-- )
67 memmove( temp + buffer_size, temp + i * multiple_buffer->buffer_size, multiple_buffer->buffer_size );
69 else
71 for( uint32_t i = 1; i < multiple_buffer->number_of_buffers; i++ )
72 memmove( (uint8_t *)multiple_buffer->buffers + buffer_size,
73 (uint8_t *)multiple_buffer->buffers + i * multiple_buffer->buffer_size,
74 multiple_buffer->buffer_size );
75 temp = lsmash_realloc( multiple_buffer->buffers, multiple_buffer->number_of_buffers * buffer_size );
76 if( !temp )
77 return NULL;
79 multiple_buffer->buffers = temp;
80 multiple_buffer->buffer_size = buffer_size;
81 return multiple_buffer;
84 void lsmash_destroy_multiple_buffers( lsmash_multiple_buffers_t *multiple_buffer )
86 if( !multiple_buffer )
87 return;
88 lsmash_free( multiple_buffer->buffers );
89 lsmash_free( multiple_buffer );