| OLD | NEW |
| 1 /* libFLAC - Free Lossless Audio Codec library | 1 /* libFLAC - Free Lossless Audio Codec library |
| 2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | 2 * Copyright (C) 2000-2009 Josh Coalson |
| 3 * Copyright (C) 2011-2014 Xiph.Org Foundation |
| 3 * | 4 * |
| 4 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 6 * are met: | 7 * are met: |
| 7 * | 8 * |
| 8 * - Redistributions of source code must retain the above copyright | 9 * - Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| 10 * | 11 * |
| 11 * - Redistributions in binary form must reproduce the above copyright | 12 * - Redistributions in binary form must reproduce the above copyright |
| 12 * notice, this list of conditions and the following disclaimer in the | 13 * notice, this list of conditions and the following disclaimer in the |
| 13 * documentation and/or other materials provided with the distribution. | 14 * documentation and/or other materials provided with the distribution. |
| 14 * | 15 * |
| 15 * - Neither the name of the Xiph.org Foundation nor the names of its | 16 * - Neither the name of the Xiph.org Foundation nor the names of its |
| 16 * contributors may be used to endorse or promote products derived from | 17 * contributors may be used to endorse or promote products derived from |
| 17 * this software without specific prior written permission. | 18 * this software without specific prior written permission. |
| 18 * | 19 * |
| 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR | 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR |
| 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 30 */ | 31 */ |
| 31 | 32 |
| 32 #if HAVE_CONFIG_H | 33 #ifdef HAVE_CONFIG_H |
| 33 # include <config.h> | 34 # include <config.h> |
| 34 #endif | 35 #endif |
| 35 | 36 |
| 36 #include <stdio.h> | 37 #include <stdio.h> |
| 37 #include <stdlib.h> /* for qsort() */ | 38 #include <stdlib.h> /* for qsort() */ |
| 38 #include <string.h> /* for memset() */ | 39 #include <string.h> /* for memset() */ |
| 39 #include "FLAC/assert.h" | 40 #include "FLAC/assert.h" |
| 40 #include "FLAC/format.h" | 41 #include "FLAC/format.h" |
| 42 #include "share/compat.h" |
| 41 #include "private/format.h" | 43 #include "private/format.h" |
| 42 | 44 #include "private/macros.h" |
| 43 #ifndef FLaC__INLINE | |
| 44 #define FLaC__INLINE | |
| 45 #endif | |
| 46 | |
| 47 #ifdef min | |
| 48 #undef min | |
| 49 #endif | |
| 50 #define min(a,b) ((a)<(b)?(a):(b)) | |
| 51 | |
| 52 /* adjust for compilers that can't understand using LLU suffix for uint64_t lite
rals */ | |
| 53 #ifdef _MSC_VER | |
| 54 #define FLAC__U64L(x) x | |
| 55 #else | |
| 56 #define FLAC__U64L(x) x##LLU | |
| 57 #endif | |
| 58 | 45 |
| 59 /* VERSION should come from configure */ | 46 /* VERSION should come from configure */ |
| 60 FLAC_API const char *FLAC__VERSION_STRING = VERSION; | 47 FLAC_API const char *FLAC__VERSION_STRING = VERSION; |
| 61 | 48 |
| 62 #if defined _MSC_VER || defined __BORLANDC__ || defined __MINW32__ | 49 FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 201411
25"; |
| 63 /* yet one more hack because of MSVC6: */ | |
| 64 FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC 1.2.1 20070917"; | |
| 65 #else | |
| 66 FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 200709
17"; | |
| 67 #endif | |
| 68 | 50 |
| 69 FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; | 51 FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; |
| 70 FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; | 52 FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; |
| 71 FLAC_API const unsigned FLAC__STREAM_SYNC_LEN = 32; /* bits */ | 53 FLAC_API const unsigned FLAC__STREAM_SYNC_LEN = 32; /* bits */ |
| 72 | 54 |
| 73 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN = 16
; /* bits */ | 55 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN = 16
; /* bits */ |
| 74 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN = 16
; /* bits */ | 56 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN = 16
; /* bits */ |
| 75 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN = 24
; /* bits */ | 57 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN = 24
; /* bits */ |
| 76 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN = 24
; /* bits */ | 58 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN = 24
; /* bits */ |
| 77 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN = 20; /
* bits */ | 59 FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN = 20; /
* bits */ |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 | 198 |
| 217 FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate) | 199 FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate) |
| 218 { | 200 { |
| 219 if(sample_rate == 0 || sample_rate > FLAC__MAX_SAMPLE_RATE) { | 201 if(sample_rate == 0 || sample_rate > FLAC__MAX_SAMPLE_RATE) { |
| 220 return false; | 202 return false; |
| 221 } | 203 } |
| 222 else | 204 else |
| 223 return true; | 205 return true; |
| 224 } | 206 } |
| 225 | 207 |
| 208 FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigne
d sample_rate) |
| 209 { |
| 210 if(blocksize > 16384) |
| 211 return false; |
| 212 else if(sample_rate <= 48000 && blocksize > 4608) |
| 213 return false; |
| 214 else |
| 215 return true; |
| 216 } |
| 217 |
| 226 FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate) | 218 FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate) |
| 227 { | 219 { |
| 228 if( | 220 if( |
| 229 !FLAC__format_sample_rate_is_valid(sample_rate) || | 221 !FLAC__format_sample_rate_is_valid(sample_rate) || |
| 230 ( | 222 ( |
| 231 sample_rate >= (1u << 16) && | 223 sample_rate >= (1u << 16) && |
| 232 !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) | 224 !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) |
| 233 ) | 225 ) |
| 234 ) { | 226 ) { |
| 235 return false; | 227 return false; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 | 298 |
| 307 return j; | 299 return j; |
| 308 } | 300 } |
| 309 | 301 |
| 310 /* | 302 /* |
| 311 * also disallows non-shortest-form encodings, c.f. | 303 * also disallows non-shortest-form encodings, c.f. |
| 312 * http://www.unicode.org/versions/corrigendum1.html | 304 * http://www.unicode.org/versions/corrigendum1.html |
| 313 * and a more clear explanation at the end of this section: | 305 * and a more clear explanation at the end of this section: |
| 314 * http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | 306 * http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
| 315 */ | 307 */ |
| 316 static FLaC__INLINE unsigned utf8len_(const FLAC__byte *utf8) | 308 static unsigned utf8len_(const FLAC__byte *utf8) |
| 317 { | 309 { |
| 318 FLAC__ASSERT(0 != utf8); | 310 FLAC__ASSERT(0 != utf8); |
| 319 if ((utf8[0] & 0x80) == 0) { | 311 if ((utf8[0] & 0x80) == 0) { |
| 320 return 1; | 312 return 1; |
| 321 } | 313 } |
| 322 else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { | 314 else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { |
| 323 if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */ | 315 if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */ |
| 324 return 0; | 316 return 0; |
| 325 return 2; | 317 return 2; |
| 326 } | 318 } |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 ); | 521 ); |
| 530 } | 522 } |
| 531 | 523 |
| 532 unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned block
size) | 524 unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned block
size) |
| 533 { | 525 { |
| 534 unsigned max_rice_partition_order = 0; | 526 unsigned max_rice_partition_order = 0; |
| 535 while(!(blocksize & 1)) { | 527 while(!(blocksize & 1)) { |
| 536 max_rice_partition_order++; | 528 max_rice_partition_order++; |
| 537 blocksize >>= 1; | 529 blocksize >>= 1; |
| 538 } | 530 } |
| 539 » return min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order); | 531 » return flac_min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order
); |
| 540 } | 532 } |
| 541 | 533 |
| 542 unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_an
d_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order) | 534 unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_an
d_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order) |
| 543 { | 535 { |
| 544 unsigned max_rice_partition_order = limit; | 536 unsigned max_rice_partition_order = limit; |
| 545 | 537 |
| 546 while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_o
rder) <= predictor_order) | 538 while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_o
rder) <= predictor_order) |
| 547 max_rice_partition_order--; | 539 max_rice_partition_order--; |
| 548 | 540 |
| 549 FLAC__ASSERT( | 541 FLAC__ASSERT( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 574 FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object
); | 566 FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object
); |
| 575 } | 567 } |
| 576 | 568 |
| 577 FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_s
ize(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_part
ition_order) | 569 FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_s
ize(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_part
ition_order) |
| 578 { | 570 { |
| 579 FLAC__ASSERT(0 != object); | 571 FLAC__ASSERT(0 != object); |
| 580 | 572 |
| 581 FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters &
& 0 == object->raw_bits)); | 573 FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters &
& 0 == object->raw_bits)); |
| 582 | 574 |
| 583 if(object->capacity_by_order < max_partition_order) { | 575 if(object->capacity_by_order < max_partition_order) { |
| 584 » » if(0 == (object->parameters = (unsigned*)realloc(object->paramet
ers, sizeof(unsigned)*((size_t)1 << max_partition_order)))) | 576 » » if(0 == (object->parameters = realloc(object->parameters, sizeof
(unsigned)*(1 << max_partition_order)))) |
| 585 return false; | 577 return false; |
| 586 » » if(0 == (object->raw_bits = (unsigned*)realloc(object->raw_bits,
sizeof(unsigned)*((size_t)1 << max_partition_order)))) | 578 » » if(0 == (object->raw_bits = realloc(object->raw_bits, sizeof(uns
igned)*(1 << max_partition_order)))) |
| 587 return false; | 579 return false; |
| 588 » » memset(object->raw_bits, 0, sizeof(unsigned)*((size_t)1 << max_p
artition_order)); | 580 » » memset(object->raw_bits, 0, sizeof(unsigned)*(1 << max_partition
_order)); |
| 589 object->capacity_by_order = max_partition_order; | 581 object->capacity_by_order = max_partition_order; |
| 590 } | 582 } |
| 591 | 583 |
| 592 return true; | 584 return true; |
| 593 } | 585 } |
| OLD | NEW |