Mercurial > audlegacy-plugins
comparison src/flac113/libflac/stream_encoder_framing.c @ 715:a9b178bc4ae4 trunk
[svn] Import flac. Please test.
| author | js |
|---|---|
| date | Sat, 24 Feb 2007 10:20:58 -0800 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 714:e758e9d4f861 | 715:a9b178bc4ae4 |
|---|---|
| 1 /* libFLAC - Free Lossless Audio Codec library | |
| 2 * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions | |
| 6 * are met: | |
| 7 * | |
| 8 * - Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * | |
| 11 * - Redistributions in binary form must reproduce the above copyright | |
| 12 * notice, this list of conditions and the following disclaimer in the | |
| 13 * documentation and/or other materials provided with the distribution. | |
| 14 * | |
| 15 * - 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 * this software without specific prior written permission. | |
| 18 * | |
| 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR | |
| 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
| 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| 28 * 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 */ | |
| 31 | |
| 32 #if HAVE_CONFIG_H | |
| 33 # include <config.h> | |
| 34 #endif | |
| 35 | |
| 36 #include <stdio.h> | |
| 37 #include <string.h> /* for strlen() */ | |
| 38 #include "private/stream_encoder_framing.h" | |
| 39 #include "private/crc.h" | |
| 40 #include "FLAC/assert.h" | |
| 41 | |
| 42 #ifdef max | |
| 43 #undef max | |
| 44 #endif | |
| 45 #define max(x,y) ((x)>(y)?(x):(y)) | |
| 46 | |
| 47 static FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method); | |
| 48 static FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order); | |
| 49 | |
| 50 FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw) | |
| 51 { | |
| 52 unsigned i, j; | |
| 53 const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING); | |
| 54 | |
| 55 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->is_last, FLAC__STREAM_METADATA_IS_LAST_LEN)) | |
| 56 return false; | |
| 57 | |
| 58 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->type, FLAC__STREAM_METADATA_TYPE_LEN)) | |
| 59 return false; | |
| 60 | |
| 61 /* | |
| 62 * First, for VORBIS_COMMENTs, adjust the length to reflect our vendor string | |
| 63 */ | |
| 64 i = metadata->length; | |
| 65 if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { | |
| 66 FLAC__ASSERT(metadata->data.vorbis_comment.vendor_string.length == 0 || 0 != metadata->data.vorbis_comment.vendor_string.entry); | |
| 67 i -= metadata->data.vorbis_comment.vendor_string.length; | |
| 68 i += vendor_string_length; | |
| 69 } | |
| 70 FLAC__ASSERT(i < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); | |
| 71 if(!FLAC__bitwriter_write_raw_uint32(bw, i, FLAC__STREAM_METADATA_LENGTH_LEN)) | |
| 72 return false; | |
| 73 | |
| 74 switch(metadata->type) { | |
| 75 case FLAC__METADATA_TYPE_STREAMINFO: | |
| 76 FLAC__ASSERT(metadata->data.stream_info.min_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)); | |
| 77 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)) | |
| 78 return false; | |
| 79 FLAC__ASSERT(metadata->data.stream_info.max_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)); | |
| 80 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) | |
| 81 return false; | |
| 82 FLAC__ASSERT(metadata->data.stream_info.min_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)); | |
| 83 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_framesize, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) | |
| 84 return false; | |
| 85 FLAC__ASSERT(metadata->data.stream_info.max_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)); | |
| 86 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_framesize, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) | |
| 87 return false; | |
| 88 FLAC__ASSERT(FLAC__format_sample_rate_is_valid(metadata->data.stream_info.sample_rate)); | |
| 89 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.sample_rate, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) | |
| 90 return false; | |
| 91 FLAC__ASSERT(metadata->data.stream_info.channels > 0); | |
| 92 FLAC__ASSERT(metadata->data.stream_info.channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)); | |
| 93 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.channels-1, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) | |
| 94 return false; | |
| 95 FLAC__ASSERT(metadata->data.stream_info.bits_per_sample > 0); | |
| 96 FLAC__ASSERT(metadata->data.stream_info.bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); | |
| 97 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.bits_per_sample-1, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) | |
| 98 return false; | |
| 99 if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) | |
| 100 return false; | |
| 101 if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.stream_info.md5sum, 16)) | |
| 102 return false; | |
| 103 break; | |
| 104 case FLAC__METADATA_TYPE_PADDING: | |
| 105 if(!FLAC__bitwriter_write_zeroes(bw, metadata->length * 8)) | |
| 106 return false; | |
| 107 break; | |
| 108 case FLAC__METADATA_TYPE_APPLICATION: | |
| 109 if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) | |
| 110 return false; | |
| 111 if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.data, metadata->length - (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8))) | |
| 112 return false; | |
| 113 break; | |
| 114 case FLAC__METADATA_TYPE_SEEKTABLE: | |
| 115 for(i = 0; i < metadata->data.seek_table.num_points; i++) { | |
| 116 if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].sample_number, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) | |
| 117 return false; | |
| 118 if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].stream_offset, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) | |
| 119 return false; | |
| 120 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.seek_table.points[i].frame_samples, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) | |
| 121 return false; | |
| 122 } | |
| 123 break; | |
| 124 case FLAC__METADATA_TYPE_VORBIS_COMMENT: | |
| 125 if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, vendor_string_length)) | |
| 126 return false; | |
| 127 if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)FLAC__VENDOR_STRING, vendor_string_length)) | |
| 128 return false; | |
| 129 if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.num_comments)) | |
| 130 return false; | |
| 131 for(i = 0; i < metadata->data.vorbis_comment.num_comments; i++) { | |
| 132 if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.comments[i].length)) | |
| 133 return false; | |
| 134 if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.vorbis_comment.comments[i].entry, metadata->data.vorbis_comment.comments[i].length)) | |
| 135 return false; | |
| 136 } | |
| 137 break; | |
| 138 case FLAC__METADATA_TYPE_CUESHEET: | |
| 139 FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); | |
| 140 if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.cue_sheet.media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) | |
| 141 return false; | |
| 142 if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.cue_sheet.lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) | |
| 143 return false; | |
| 144 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.is_cd? 1 : 0, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) | |
| 145 return false; | |
| 146 if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) | |
| 147 return false; | |
| 148 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.num_tracks, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) | |
| 149 return false; | |
| 150 for(i = 0; i < metadata->data.cue_sheet.num_tracks; i++) { | |
| 151 const FLAC__StreamMetadata_CueSheet_Track *track = metadata->data.cue_sheet.tracks + i; | |
| 152 | |
| 153 if(!FLAC__bitwriter_write_raw_uint64(bw, track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) | |
| 154 return false; | |
| 155 if(!FLAC__bitwriter_write_raw_uint32(bw, track->number, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) | |
| 156 return false; | |
| 157 FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); | |
| 158 if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) | |
| 159 return false; | |
| 160 if(!FLAC__bitwriter_write_raw_uint32(bw, track->type, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) | |
| 161 return false; | |
| 162 if(!FLAC__bitwriter_write_raw_uint32(bw, track->pre_emphasis, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) | |
| 163 return false; | |
| 164 if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) | |
| 165 return false; | |
| 166 if(!FLAC__bitwriter_write_raw_uint32(bw, track->num_indices, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) | |
| 167 return false; | |
| 168 for(j = 0; j < track->num_indices; j++) { | |
| 169 const FLAC__StreamMetadata_CueSheet_Index *index = track->indices + j; | |
| 170 | |
| 171 if(!FLAC__bitwriter_write_raw_uint64(bw, index->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) | |
| 172 return false; | |
| 173 if(!FLAC__bitwriter_write_raw_uint32(bw, index->number, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) | |
| 174 return false; | |
| 175 if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) | |
| 176 return false; | |
| 177 } | |
| 178 } | |
| 179 break; | |
| 180 case FLAC__METADATA_TYPE_PICTURE: | |
| 181 { | |
| 182 size_t len; | |
| 183 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.type, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) | |
| 184 return false; | |
| 185 len = strlen(metadata->data.picture.mime_type); | |
| 186 if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) | |
| 187 return false; | |
| 188 if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.picture.mime_type, len)) | |
| 189 return false; | |
| 190 len = strlen((const char *)metadata->data.picture.description); | |
| 191 if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) | |
| 192 return false; | |
| 193 if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.description, len)) | |
| 194 return false; | |
| 195 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) | |
| 196 return false; | |
| 197 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) | |
| 198 return false; | |
| 199 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) | |
| 200 return false; | |
| 201 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) | |
| 202 return false; | |
| 203 if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.data_length, FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) | |
| 204 return false; | |
| 205 if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.data, metadata->data.picture.data_length)) | |
| 206 return false; | |
| 207 } | |
| 208 break; | |
| 209 default: | |
| 210 if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.unknown.data, metadata->length)) | |
| 211 return false; | |
| 212 break; | |
| 213 } | |
| 214 | |
| 215 FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); | |
| 216 return true; | |
| 217 } | |
| 218 | |
| 219 FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw) | |
| 220 { | |
| 221 unsigned u, blocksize_hint, sample_rate_hint; | |
| 222 FLAC__byte crc; | |
| 223 | |
| 224 FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); | |
| 225 | |
| 226 if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN)) | |
| 227 return false; | |
| 228 | |
| 229 if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_RESERVED_LEN)) | |
| 230 return false; | |
| 231 | |
| 232 FLAC__ASSERT(header->blocksize > 0 && header->blocksize <= FLAC__MAX_BLOCK_SIZE); | |
| 233 /* when this assertion holds true, any legal blocksize can be expressed in the frame header */ | |
| 234 FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535u); | |
| 235 blocksize_hint = 0; | |
| 236 switch(header->blocksize) { | |
| 237 case 192: u = 1; break; | |
| 238 case 576: u = 2; break; | |
| 239 case 1152: u = 3; break; | |
| 240 case 2304: u = 4; break; | |
| 241 case 4608: u = 5; break; | |
| 242 case 256: u = 8; break; | |
| 243 case 512: u = 9; break; | |
| 244 case 1024: u = 10; break; | |
| 245 case 2048: u = 11; break; | |
| 246 case 4096: u = 12; break; | |
| 247 case 8192: u = 13; break; | |
| 248 case 16384: u = 14; break; | |
| 249 case 32768: u = 15; break; | |
| 250 default: | |
| 251 if(header->blocksize <= 0x100) | |
| 252 blocksize_hint = u = 6; | |
| 253 else if(header->blocksize <= 0x10000) | |
| 254 blocksize_hint = u = 7; | |
| 255 else | |
| 256 u = 0; | |
| 257 break; | |
| 258 } | |
| 259 if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BLOCK_SIZE_LEN)) | |
| 260 return false; | |
| 261 | |
| 262 FLAC__ASSERT(FLAC__format_sample_rate_is_valid(header->sample_rate)); | |
| 263 sample_rate_hint = 0; | |
| 264 switch(header->sample_rate) { | |
| 265 case 8000: u = 4; break; | |
| 266 case 16000: u = 5; break; | |
| 267 case 22050: u = 6; break; | |
| 268 case 24000: u = 7; break; | |
| 269 case 32000: u = 8; break; | |
| 270 case 44100: u = 9; break; | |
| 271 case 48000: u = 10; break; | |
| 272 case 96000: u = 11; break; | |
| 273 default: | |
| 274 if(header->sample_rate <= 255000 && header->sample_rate % 1000 == 0) | |
| 275 sample_rate_hint = u = 12; | |
| 276 else if(header->sample_rate % 10 == 0) | |
| 277 sample_rate_hint = u = 14; | |
| 278 else if(header->sample_rate <= 0xffff) | |
| 279 sample_rate_hint = u = 13; | |
| 280 else | |
| 281 u = 0; | |
| 282 break; | |
| 283 } | |
| 284 if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_SAMPLE_RATE_LEN)) | |
| 285 return false; | |
| 286 | |
| 287 FLAC__ASSERT(header->channels > 0 && header->channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN) && header->channels <= FLAC__MAX_CHANNELS); | |
| 288 switch(header->channel_assignment) { | |
| 289 case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: | |
| 290 u = header->channels - 1; | |
| 291 break; | |
| 292 case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: | |
| 293 FLAC__ASSERT(header->channels == 2); | |
| 294 u = 8; | |
| 295 break; | |
| 296 case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: | |
| 297 FLAC__ASSERT(header->channels == 2); | |
| 298 u = 9; | |
| 299 break; | |
| 300 case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: | |
| 301 FLAC__ASSERT(header->channels == 2); | |
| 302 u = 10; | |
| 303 break; | |
| 304 default: | |
| 305 FLAC__ASSERT(0); | |
| 306 } | |
| 307 if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN)) | |
| 308 return false; | |
| 309 | |
| 310 FLAC__ASSERT(header->bits_per_sample > 0 && header->bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); | |
| 311 switch(header->bits_per_sample) { | |
| 312 case 8 : u = 1; break; | |
| 313 case 12: u = 2; break; | |
| 314 case 16: u = 4; break; | |
| 315 case 20: u = 5; break; | |
| 316 case 24: u = 6; break; | |
| 317 default: u = 0; break; | |
| 318 } | |
| 319 if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN)) | |
| 320 return false; | |
| 321 | |
| 322 if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_ZERO_PAD_LEN)) | |
| 323 return false; | |
| 324 | |
| 325 FLAC__ASSERT(header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER); | |
| 326 if(!FLAC__bitwriter_write_utf8_uint32(bw, header->number.frame_number)) | |
| 327 return false; | |
| 328 | |
| 329 if(blocksize_hint) | |
| 330 if(!FLAC__bitwriter_write_raw_uint32(bw, header->blocksize-1, (blocksize_hint==6)? 8:16)) | |
| 331 return false; | |
| 332 | |
| 333 switch(sample_rate_hint) { | |
| 334 case 12: | |
| 335 if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 1000, 8)) | |
| 336 return false; | |
| 337 break; | |
| 338 case 13: | |
| 339 if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate, 16)) | |
| 340 return false; | |
| 341 break; | |
| 342 case 14: | |
| 343 if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 10, 16)) | |
| 344 return false; | |
| 345 break; | |
| 346 } | |
| 347 | |
| 348 /* write the CRC */ | |
| 349 if(!FLAC__bitwriter_get_write_crc8(bw, &crc)) | |
| 350 return false; | |
| 351 if(!FLAC__bitwriter_write_raw_uint32(bw, crc, FLAC__FRAME_HEADER_CRC_LEN)) | |
| 352 return false; | |
| 353 | |
| 354 return true; | |
| 355 } | |
| 356 | |
| 357 FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) | |
| 358 { | |
| 359 FLAC__bool ok; | |
| 360 | |
| 361 ok = | |
| 362 FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN) && | |
| 363 (wasted_bits? FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1) : true) && | |
| 364 FLAC__bitwriter_write_raw_int32(bw, subframe->value, subframe_bps) | |
| 365 ; | |
| 366 | |
| 367 return ok; | |
| 368 } | |
| 369 | |
| 370 FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) | |
| 371 { | |
| 372 unsigned i; | |
| 373 | |
| 374 if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK | (subframe->order<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) | |
| 375 return false; | |
| 376 if(wasted_bits) | |
| 377 if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) | |
| 378 return false; | |
| 379 | |
| 380 for(i = 0; i < subframe->order; i++) | |
| 381 if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) | |
| 382 return false; | |
| 383 | |
| 384 if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) | |
| 385 return false; | |
| 386 switch(subframe->entropy_coding_method.type) { | |
| 387 case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: | |
| 388 if(!add_residual_partitioned_rice_(bw, subframe->residual, residual_samples, subframe->order, subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, subframe->entropy_coding_method.data.partitioned_rice.order)) | |
| 389 return false; | |
| 390 break; | |
| 391 default: | |
| 392 FLAC__ASSERT(0); | |
| 393 } | |
| 394 | |
| 395 return true; | |
| 396 } | |
| 397 | |
| 398 FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) | |
| 399 { | |
| 400 unsigned i; | |
| 401 | |
| 402 if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK | ((subframe->order-1)<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) | |
| 403 return false; | |
| 404 if(wasted_bits) | |
| 405 if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) | |
| 406 return false; | |
| 407 | |
| 408 for(i = 0; i < subframe->order; i++) | |
| 409 if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) | |
| 410 return false; | |
| 411 | |
| 412 if(!FLAC__bitwriter_write_raw_uint32(bw, subframe->qlp_coeff_precision-1, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) | |
| 413 return false; | |
| 414 if(!FLAC__bitwriter_write_raw_int32(bw, subframe->quantization_level, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) | |
| 415 return false; | |
| 416 for(i = 0; i < subframe->order; i++) | |
| 417 if(!FLAC__bitwriter_write_raw_int32(bw, subframe->qlp_coeff[i], subframe->qlp_coeff_precision)) | |
| 418 return false; | |
| 419 | |
| 420 if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) | |
| 421 return false; | |
| 422 switch(subframe->entropy_coding_method.type) { | |
| 423 case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: | |
| 424 if(!add_residual_partitioned_rice_(bw, subframe->residual, residual_samples, subframe->order, subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, subframe->entropy_coding_method.data.partitioned_rice.order)) | |
| 425 return false; | |
| 426 break; | |
| 427 default: | |
| 428 FLAC__ASSERT(0); | |
| 429 } | |
| 430 | |
| 431 return true; | |
| 432 } | |
| 433 | |
| 434 FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) | |
| 435 { | |
| 436 unsigned i; | |
| 437 const FLAC__int32 *signal = subframe->data; | |
| 438 | |
| 439 if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) | |
| 440 return false; | |
| 441 if(wasted_bits) | |
| 442 if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) | |
| 443 return false; | |
| 444 | |
| 445 for(i = 0; i < samples; i++) | |
| 446 if(!FLAC__bitwriter_write_raw_int32(bw, signal[i], subframe_bps)) | |
| 447 return false; | |
| 448 | |
| 449 return true; | |
| 450 } | |
| 451 | |
| 452 FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method) | |
| 453 { | |
| 454 if(!FLAC__bitwriter_write_raw_uint32(bw, method->type, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) | |
| 455 return false; | |
| 456 switch(method->type) { | |
| 457 case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: | |
| 458 if(!FLAC__bitwriter_write_raw_uint32(bw, method->data.partitioned_rice.order, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) | |
| 459 return false; | |
| 460 break; | |
| 461 default: | |
| 462 FLAC__ASSERT(0); | |
| 463 } | |
| 464 return true; | |
| 465 } | |
| 466 | |
| 467 FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order) | |
| 468 { | |
| 469 if(partition_order == 0) { | |
| 470 unsigned i; | |
| 471 | |
| 472 if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[0], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN)) | |
| 473 return false; | |
| 474 if(rice_parameters[0] < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { | |
| 475 if(!FLAC__bitwriter_write_rice_signed_block(bw, residual, residual_samples, rice_parameters[0])) | |
| 476 return false; | |
| 477 } | |
| 478 else { | |
| 479 if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[0], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) | |
| 480 return false; | |
| 481 for(i = 0; i < residual_samples; i++) { | |
| 482 if(!FLAC__bitwriter_write_raw_int32(bw, residual[i], raw_bits[0])) | |
| 483 return false; | |
| 484 } | |
| 485 } | |
| 486 return true; | |
| 487 } | |
| 488 else { | |
| 489 unsigned i, j, k = 0, k_last = 0; | |
| 490 unsigned partition_samples; | |
| 491 const unsigned default_partition_samples = (residual_samples+predictor_order) >> partition_order; | |
| 492 for(i = 0; i < (1u<<partition_order); i++) { | |
| 493 if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[i], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN)) | |
| 494 return false; | |
| 495 partition_samples = default_partition_samples; | |
| 496 if(i == 0) | |
| 497 partition_samples -= predictor_order; | |
| 498 k += partition_samples; | |
| 499 if(rice_parameters[i] < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { | |
| 500 if(!FLAC__bitwriter_write_rice_signed_block(bw, residual+k_last, k-k_last, rice_parameters[i])) | |
| 501 return false; | |
| 502 } | |
| 503 else { | |
| 504 if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[i], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) | |
| 505 return false; | |
| 506 for(j = k_last; j < k; j++) { | |
| 507 if(!FLAC__bitwriter_write_raw_int32(bw, residual[j], raw_bits[i])) | |
| 508 return false; | |
| 509 } | |
| 510 } | |
| 511 k_last = k; | |
| 512 } | |
| 513 return true; | |
| 514 } | |
| 515 } |
