📄 format.c
字号:
if(!first) { if(seek_table->points[i].sample_number == seek_table->points[j-1].sample_number) continue; } } first = false; seek_table->points[j++] = seek_table->points[i]; } for(i = j; i < seek_table->num_points; i++) { seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; seek_table->points[i].stream_offset = 0; seek_table->points[i].frame_samples = 0; } return j;}static __inline unsigned utf8len_(const FLAC__byte *utf8){ FLAC__ASSERT(0 != utf8); if ((utf8[0] & 0x80) == 0) return 1; else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) return 2; else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) return 3; else return 0;}FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name){ char c; for(c = *name; c; c = *(++name)) if(c < 0x20 || c == 0x3d || c > 0x7d) return false; return true;}FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length){ if(length == (unsigned)(-1)) { while(*value) { unsigned n = utf8len_(value); if(n == 0) return false; value += n; } } else { const FLAC__byte *end = value + length; while(value < end) { unsigned n = utf8len_(value); if(n == 0) return false; value += n; } if(value != end) return false; } return true;}FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length){ const FLAC__byte *s, *end; for(s = entry, end = s + length; s < end && *s != '='; s++) { if(*s < 0x20 || *s > 0x7D) return false; } if(s == end) return false; s++; /* skip '=' */ while(s < end) { unsigned n = utf8len_(s); if(n == 0) return false; s += n; } if(s != end) return false; return true;}FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation){ unsigned i, j; if(check_cd_da_subset) { if(cue_sheet->lead_in < 2 * 44100) { if(violation) *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds"; return false; } if(cue_sheet->lead_in % 588 != 0) { if(violation) *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples"; return false; } } if(cue_sheet->num_tracks == 0) { if(violation) *violation = "cue sheet must have at least one track (the lead-out)"; return false; } if(check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks-1].number != 170) { if(violation) *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)"; return false; } for(i = 0; i < cue_sheet->num_tracks; i++) { if(cue_sheet->tracks[i].number == 0) { if(violation) *violation = "cue sheet may not have a track number 0"; return false; } if(check_cd_da_subset) { if(!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) { if(violation) *violation = "CD-DA cue sheet track number must be 1-99 or 170"; return false; } } if(check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) { if(violation) *violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples"; return false; } if(i < cue_sheet->num_tracks - 1) { if(cue_sheet->tracks[i].num_indices == 0) { if(violation) *violation = "cue sheet track must have at least one index point"; return false; } if(cue_sheet->tracks[i].indices[0].number > 1) { if(violation) *violation = "cue sheet track's first index number must be 0 or 1"; return false; } } for(j = 0; j < cue_sheet->tracks[i].num_indices; j++) { if(check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) { if(violation) *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples"; return false; } if(j > 0) { if(cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j-1].number + 1) { if(violation) *violation = "cue sheet track index numbers must increase by 1"; return false; } } } } return true;}/* * These routines are private to libFLAC */unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order){ return FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order( FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize), blocksize, predictor_order );}unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize){ unsigned max_rice_partition_order = 0; while(!(blocksize & 1)) { max_rice_partition_order++; blocksize >>= 1; } return min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order);}unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order){ unsigned max_rice_partition_order = limit; while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order) max_rice_partition_order--; FLAC__ASSERT( (max_rice_partition_order == 0 && blocksize >= predictor_order) || (max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order) ); return max_rice_partition_order;}void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object){ FLAC__ASSERT(0 != object); object->parameters = 0; object->raw_bits = 0; object->capacity_by_order = 0;}void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object){ FLAC__ASSERT(0 != object); if(0 != object->parameters) free(object->parameters); if(0 != object->raw_bits) free(object->raw_bits); FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object);}FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order){ FLAC__ASSERT(0 != object); FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits)); if(object->capacity_by_order < max_partition_order) { if(0 == (object->parameters = (unsigned*)realloc(object->parameters, sizeof(unsigned)*(1 << max_partition_order)))) return false; if(0 == (object->raw_bits = (unsigned*)realloc(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order)))) return false; object->capacity_by_order = max_partition_order; } return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -