415
465
case FLAC__METADATA_TYPE_VORBIS_COMMENT:
417
object->data.vorbis_comment.vendor_string.length = (unsigned)strlen(FLAC__VENDOR_STRING);
418
if(!copy_bytes_(&object->data.vorbis_comment.vendor_string.entry, (const FLAC__byte*)FLAC__VENDOR_STRING, object->data.vorbis_comment.vendor_string.length+1)) {
422
vorbiscomment_calculate_length_(object);
466
object->data.vorbis_comment.vendor_string.length = (unsigned)strlen(FLAC__VENDOR_STRING);
467
if(!copy_bytes_(&object->data.vorbis_comment.vendor_string.entry, (const FLAC__byte*)FLAC__VENDOR_STRING, object->data.vorbis_comment.vendor_string.length+1)) {
471
vorbiscomment_calculate_length_(object);
425
473
case FLAC__METADATA_TYPE_CUESHEET:
426
474
cuesheet_calculate_length_(object);
476
case FLAC__METADATA_TYPE_PICTURE:
478
FLAC__STREAM_METADATA_PICTURE_TYPE_LEN +
479
FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* empty mime_type string */
480
FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* empty description string */
481
FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN +
482
FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN +
483
FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN +
484
FLAC__STREAM_METADATA_PICTURE_COLORS_LEN +
485
FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN +
488
object->data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER;
489
object->data.picture.mime_type = 0;
490
object->data.picture.description = 0;
491
/* calloc() took care of this for us:
492
object->data.picture.width = 0;
493
object->data.picture.height = 0;
494
object->data.picture.depth = 0;
495
object->data.picture.colors = 0;
496
object->data.picture.data_length = 0;
497
object->data.picture.data = 0;
499
/* now initialize mime_type and description with empty strings to make things easier on the client */
500
if(!copy_cstring_(&object->data.picture.mime_type, "")) {
504
if(!copy_cstring_((char**)(&object->data.picture.description), "")) {
505
if(object->data.picture.mime_type)
506
free(object->data.picture.mime_type);
429
512
/* calloc() took care of this for us:
430
513
object->length = 0;
590
case FLAC__METADATA_TYPE_PICTURE:
591
to->data.picture.type = object->data.picture.type;
592
if(!copy_cstring_(&to->data.picture.mime_type, object->data.picture.mime_type)) {
593
FLAC__metadata_object_delete(to);
596
if(!copy_cstring_((char**)(&to->data.picture.description), (const char*)object->data.picture.description)) {
597
FLAC__metadata_object_delete(to);
600
to->data.picture.width = object->data.picture.width;
601
to->data.picture.height = object->data.picture.height;
602
to->data.picture.depth = object->data.picture.depth;
603
to->data.picture.colors = object->data.picture.colors;
604
to->data.picture.data_length = object->data.picture.data_length;
605
if(!copy_bytes_((&to->data.picture.data), object->data.picture.data, object->data.picture.data_length)) {
606
FLAC__metadata_object_delete(to);
508
611
if(!copy_bytes_(&to->data.unknown.data, object->data.unknown.data, object->length)) {
509
612
FLAC__metadata_object_delete(to);
552
655
cuesheet_track_array_delete_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks);
658
case FLAC__METADATA_TYPE_PICTURE:
659
if(0 != object->data.picture.mime_type) {
660
free(object->data.picture.mime_type);
661
object->data.picture.mime_type = 0;
663
if(0 != object->data.picture.description) {
664
free(object->data.picture.description);
665
object->data.picture.description = 0;
667
if(0 != object->data.picture.data) {
668
free(object->data.picture.data);
669
object->data.picture.data = 0;
556
673
if(0 != object->data.unknown.data) {
557
674
free(object->data.unknown.data);
826
static FLAC__bool compare_block_data_picture_(const FLAC__StreamMetadata_Picture *block1, const FLAC__StreamMetadata_Picture *block2)
828
if(block1->type != block2->type)
830
if(block1->mime_type != block2->mime_type && (0 == block1->mime_type || 0 == block2->mime_type || strcmp(block1->mime_type, block2->mime_type)))
832
if(block1->description != block2->description && (0 == block1->description || 0 == block2->description || strcmp((const char *)block1->description, (const char *)block2->description)))
834
if(block1->width != block2->width)
836
if(block1->height != block2->height)
838
if(block1->depth != block2->depth)
840
if(block1->colors != block2->colors)
842
if(block1->data_length != block2->data_length)
844
if(block1->data != block2->data && (0 == block1->data || 0 == block2->data || memcmp(block1->data, block2->data, block1->data_length)))
709
849
static FLAC__bool compare_block_data_unknown_(const FLAC__StreamMetadata_Unknown *block1, const FLAC__StreamMetadata_Unknown *block2, unsigned block_length)
711
851
FLAC__ASSERT(0 != block1);
1095
FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples)
1097
FLAC__ASSERT(0 != object);
1098
FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
1099
FLAC__ASSERT(samples > 0);
1100
FLAC__ASSERT(total_samples > 0);
1102
if(samples > 0 && total_samples > 0) {
1103
FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table;
1105
FLAC__uint64 num, sample;
1107
num = 1 + total_samples / samples; /* 1+ for the first sample at 0 */
1108
/* now account for the fact that we don't place a seekpoint at "total_samples" since samples are number from 0: */
1109
if(total_samples % samples == 0)
1112
i = seek_table->num_points;
1114
if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + (unsigned)num))
1118
for(j = 0; j < num; i++, j++, sample += samples) {
1119
seek_table->points[i].sample_number = sample;
1120
seek_table->points[i].stream_offset = 0;
1121
seek_table->points[i].frame_samples = 0;
953
1128
FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact)
955
1130
unsigned unique;
1074
1249
field_name_length = eq-entry.entry;
1076
if((i = vorbiscomment_find_entry_from_(object, 0, entry.entry, field_name_length)) >= 0) {
1251
if((i = vorbiscomment_find_entry_from_(object, 0, (const char *)entry.entry, field_name_length)) >= 0) {
1077
1252
unsigned index = (unsigned)i;
1078
1253
if(!FLAC__metadata_object_vorbiscomment_set_comment(object, index, entry, copy))
1080
1255
if(all && (index+1 < object->data.vorbis_comment.num_comments)) {
1081
for(i = vorbiscomment_find_entry_from_(object, index+1, entry.entry, field_name_length); i >= 0; ) {
1256
for(i = vorbiscomment_find_entry_from_(object, index+1, (const char *)entry.entry, field_name_length); i >= 0; ) {
1082
1257
if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i))
1084
1259
if((unsigned)i < object->data.vorbis_comment.num_comments)
1085
i = vorbiscomment_find_entry_from_(object, (unsigned)i, entry.entry, field_name_length);
1260
i = vorbiscomment_find_entry_from_(object, (unsigned)i, (const char *)entry.entry, field_name_length);
1471
1646
return FLAC__format_cuesheet_is_legal(&object->data.cue_sheet, check_cd_da_subset, violation);
1649
static FLAC__uint64 get_index_01_offset_(const FLAC__StreamMetadata_CueSheet *cs, unsigned track)
1651
if (track >= (cs->num_tracks-1) || cs->tracks[track].num_indices < 1)
1653
else if (cs->tracks[track].indices[0].number == 1)
1654
return cs->tracks[track].indices[0].offset + cs->tracks[track].offset + cs->lead_in;
1655
else if (cs->tracks[track].num_indices < 2)
1657
else if (cs->tracks[track].indices[1].number == 1)
1658
return cs->tracks[track].indices[1].offset + cs->tracks[track].offset + cs->lead_in;
1663
static FLAC__uint32 cddb_add_digits_(FLAC__uint32 x)
1673
FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object)
1675
const FLAC__StreamMetadata_CueSheet *cs;
1677
FLAC__ASSERT(0 != object);
1678
FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
1680
cs = &object->data.cue_sheet;
1682
if (cs->num_tracks < 2) /* need at least one real track and the lead-out track */
1686
FLAC__uint32 i, length, sum = 0;
1687
for (i = 0; i < (cs->num_tracks-1); i++) /* -1 to avoid counting the lead-out */
1688
sum += cddb_add_digits_((FLAC__uint32)(get_index_01_offset_(cs, i) / 44100));
1689
length = (FLAC__uint32)((cs->tracks[cs->num_tracks-1].offset+cs->lead_in) / 44100) - (FLAC__uint32)(get_index_01_offset_(cs, 0) / 44100);
1691
return (sum % 0xFF) << 24 | length << 8 | (FLAC__uint32)(cs->num_tracks-1);
1695
FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy)
1698
size_t old_length, new_length;
1700
FLAC__ASSERT(0 != object);
1701
FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
1702
FLAC__ASSERT(0 != mime_type);
1704
old = object->data.picture.mime_type;
1705
old_length = old? strlen(old) : 0;
1706
new_length = strlen(mime_type);
1708
/* do the copy first so that if we fail we leave the object untouched */
1710
if(!copy_bytes_((FLAC__byte**)(&object->data.picture.mime_type), (FLAC__byte*)mime_type, new_length+1))
1714
object->data.picture.mime_type = mime_type;
1720
object->length -= old_length;
1721
object->length += new_length;
1725
FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy)
1728
size_t old_length, new_length;
1730
FLAC__ASSERT(0 != object);
1731
FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
1732
FLAC__ASSERT(0 != description);
1734
old = object->data.picture.description;
1735
old_length = old? strlen((const char *)old) : 0;
1736
new_length = strlen((const char *)description);
1738
/* do the copy first so that if we fail we leave the object untouched */
1740
if(!copy_bytes_(&object->data.picture.description, description, new_length+1))
1744
object->data.picture.description = description;
1750
object->length -= old_length;
1751
object->length += new_length;
1755
FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy)
1759
FLAC__ASSERT(0 != object);
1760
FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
1761
FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false));
1763
old = object->data.picture.data;
1765
/* do the copy first so that if we fail we leave the object untouched */
1767
if(!copy_bytes_(&object->data.picture.data, data, length))
1771
object->data.picture.data = data;
1777
object->length -= object->data.picture.data_length;
1778
object->data.picture.data_length = length;
1779
object->length += length;
1783
FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation)
1785
FLAC__ASSERT(0 != object);
1786
FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
1788
return FLAC__format_picture_is_legal(&object->data.picture, violation);