1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2011-2017 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 */
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
)
31 lsmash_multiple_buffers_t
*multiple_buffer
= lsmash_malloc( sizeof(lsmash_multiple_buffers_t
) );
32 if( !multiple_buffer
)
34 multiple_buffer
->buffers
= lsmash_malloc( number_of_buffers
* buffer_size
);
35 if( !multiple_buffer
->buffers
)
37 lsmash_free( multiple_buffer
);
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
)
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
)
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
)
61 if( buffer_size
> multiple_buffer
->buffer_size
)
63 temp
= lsmash_realloc( multiple_buffer
->buffers
, multiple_buffer
->number_of_buffers
* buffer_size
);
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
);
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
);
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
)
88 lsmash_free( multiple_buffer
->buffers
);
89 lsmash_free( multiple_buffer
);