1 /* test_libFLAC - Unit tester for libFLAC
2 * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 * These are not tests, just utility functions used by the metadata tests
27 #include "FLAC/metadata.h"
28 #include "test_libs_common/metadata_utils.h"
30 #include <stdlib.h> /* for malloc() */
31 #include <string.h> /* for memcmp() */
33 FLAC__bool mutils__compare_block_data_streaminfo(const FLAC__StreamMetadata_StreamInfo *block, const FLAC__StreamMetadata_StreamInfo *blockcopy)
35 if(blockcopy->min_blocksize != block->min_blocksize) {
36 printf("FAILED, min_blocksize mismatch, expected %u, got %u\n", block->min_blocksize, blockcopy->min_blocksize);
39 if(blockcopy->max_blocksize != block->max_blocksize) {
40 printf("FAILED, max_blocksize mismatch, expected %u, got %u\n", block->max_blocksize, blockcopy->max_blocksize);
43 if(blockcopy->min_framesize != block->min_framesize) {
44 printf("FAILED, min_framesize mismatch, expected %u, got %u\n", block->min_framesize, blockcopy->min_framesize);
47 if(blockcopy->max_framesize != block->max_framesize) {
48 printf("FAILED, max_framesize mismatch, expected %u, got %u\n", block->max_framesize, blockcopy->max_framesize);
51 if(blockcopy->sample_rate != block->sample_rate) {
52 printf("FAILED, sample_rate mismatch, expected %u, got %u\n", block->sample_rate, blockcopy->sample_rate);
55 if(blockcopy->channels != block->channels) {
56 printf("FAILED, channels mismatch, expected %u, got %u\n", block->channels, blockcopy->channels);
59 if(blockcopy->bits_per_sample != block->bits_per_sample) {
60 printf("FAILED, bits_per_sample mismatch, expected %u, got %u\n", block->bits_per_sample, blockcopy->bits_per_sample);
63 if(blockcopy->total_samples != block->total_samples) {
65 printf("FAILED, total_samples mismatch, expected %I64u, got %I64u\n", block->total_samples, blockcopy->total_samples);
67 printf("FAILED, total_samples mismatch, expected %llu, got %llu\n", (unsigned long long)block->total_samples, (unsigned long long)blockcopy->total_samples);
71 if(0 != memcmp(blockcopy->md5sum, block->md5sum, sizeof(block->md5sum))) {
72 printf("FAILED, md5sum mismatch, expected %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X, got %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
73 (unsigned)block->md5sum[0],
74 (unsigned)block->md5sum[1],
75 (unsigned)block->md5sum[2],
76 (unsigned)block->md5sum[3],
77 (unsigned)block->md5sum[4],
78 (unsigned)block->md5sum[5],
79 (unsigned)block->md5sum[6],
80 (unsigned)block->md5sum[7],
81 (unsigned)block->md5sum[8],
82 (unsigned)block->md5sum[9],
83 (unsigned)block->md5sum[10],
84 (unsigned)block->md5sum[11],
85 (unsigned)block->md5sum[12],
86 (unsigned)block->md5sum[13],
87 (unsigned)block->md5sum[14],
88 (unsigned)block->md5sum[15],
89 (unsigned)blockcopy->md5sum[0],
90 (unsigned)blockcopy->md5sum[1],
91 (unsigned)blockcopy->md5sum[2],
92 (unsigned)blockcopy->md5sum[3],
93 (unsigned)blockcopy->md5sum[4],
94 (unsigned)blockcopy->md5sum[5],
95 (unsigned)blockcopy->md5sum[6],
96 (unsigned)blockcopy->md5sum[7],
97 (unsigned)blockcopy->md5sum[8],
98 (unsigned)blockcopy->md5sum[9],
99 (unsigned)blockcopy->md5sum[10],
100 (unsigned)blockcopy->md5sum[11],
101 (unsigned)blockcopy->md5sum[12],
102 (unsigned)blockcopy->md5sum[13],
103 (unsigned)blockcopy->md5sum[14],
104 (unsigned)blockcopy->md5sum[15]
111 FLAC__bool mutils__compare_block_data_padding(const FLAC__StreamMetadata_Padding *block, const FLAC__StreamMetadata_Padding *blockcopy, unsigned block_length)
113 /* we don't compare the padding guts */
114 (void)block, (void)blockcopy, (void)block_length;
118 FLAC__bool mutils__compare_block_data_application(const FLAC__StreamMetadata_Application *block, const FLAC__StreamMetadata_Application *blockcopy, unsigned block_length)
120 if(block_length < sizeof(block->id)) {
121 printf("FAILED, bad block length = %u\n", block_length);
124 if(0 != memcmp(blockcopy->id, block->id, sizeof(block->id))) {
125 printf("FAILED, id mismatch, expected %02X%02X%02X%02X, got %02X%02X%02X%02X\n",
126 (unsigned)block->id[0],
127 (unsigned)block->id[1],
128 (unsigned)block->id[2],
129 (unsigned)block->id[3],
130 (unsigned)blockcopy->id[0],
131 (unsigned)blockcopy->id[1],
132 (unsigned)blockcopy->id[2],
133 (unsigned)blockcopy->id[3]
137 if(0 == block->data || 0 == blockcopy->data) {
138 if(block->data != blockcopy->data) {
139 printf("FAILED, data mismatch (%s's data pointer is null)\n", 0==block->data?"original":"copy");
142 else if(block_length - sizeof(block->id) > 0) {
143 printf("FAILED, data pointer is null but block length is not 0\n");
148 if(block_length - sizeof(block->id) == 0) {
149 printf("FAILED, data pointer is not null but block length is 0\n");
152 else if(0 != memcmp(blockcopy->data, block->data, block_length - sizeof(block->id))) {
153 printf("FAILED, data mismatch\n");
160 FLAC__bool mutils__compare_block_data_seektable(const FLAC__StreamMetadata_SeekTable *block, const FLAC__StreamMetadata_SeekTable *blockcopy)
163 if(blockcopy->num_points != block->num_points) {
164 printf("FAILED, num_points mismatch, expected %u, got %u\n", block->num_points, blockcopy->num_points);
167 for(i = 0; i < block->num_points; i++) {
168 if(blockcopy->points[i].sample_number != block->points[i].sample_number) {
170 printf("FAILED, points[%u].sample_number mismatch, expected %I64u, got %I64u\n", i, block->points[i].sample_number, blockcopy->points[i].sample_number);
172 printf("FAILED, points[%u].sample_number mismatch, expected %llu, got %llu\n", i, (unsigned long long)block->points[i].sample_number, (unsigned long long)blockcopy->points[i].sample_number);
176 if(blockcopy->points[i].stream_offset != block->points[i].stream_offset) {
178 printf("FAILED, points[%u].stream_offset mismatch, expected %I64u, got %I64u\n", i, block->points[i].stream_offset, blockcopy->points[i].stream_offset);
180 printf("FAILED, points[%u].stream_offset mismatch, expected %llu, got %llu\n", i, (unsigned long long)block->points[i].stream_offset, (unsigned long long)blockcopy->points[i].stream_offset);
184 if(blockcopy->points[i].frame_samples != block->points[i].frame_samples) {
185 printf("FAILED, points[%u].frame_samples mismatch, expected %u, got %u\n", i, block->points[i].frame_samples, blockcopy->points[i].frame_samples);
192 FLAC__bool mutils__compare_block_data_vorbiscomment(const FLAC__StreamMetadata_VorbisComment *block, const FLAC__StreamMetadata_VorbisComment *blockcopy)
195 if(blockcopy->vendor_string.length != block->vendor_string.length) {
196 printf("FAILED, vendor_string.length mismatch, expected %u, got %u\n", block->vendor_string.length, blockcopy->vendor_string.length);
199 if(0 == block->vendor_string.entry || 0 == blockcopy->vendor_string.entry) {
200 if(block->vendor_string.entry != blockcopy->vendor_string.entry) {
201 printf("FAILED, vendor_string.entry mismatch\n");
205 else if(0 != memcmp(blockcopy->vendor_string.entry, block->vendor_string.entry, block->vendor_string.length)) {
206 printf("FAILED, vendor_string.entry mismatch\n");
209 if(blockcopy->num_comments != block->num_comments) {
210 printf("FAILED, num_comments mismatch, expected %u, got %u\n", block->num_comments, blockcopy->num_comments);
213 for(i = 0; i < block->num_comments; i++) {
214 if(blockcopy->comments[i].length != block->comments[i].length) {
215 printf("FAILED, comments[%u].length mismatch, expected %u, got %u\n", i, block->comments[i].length, blockcopy->comments[i].length);
218 if(0 == block->comments[i].entry || 0 == blockcopy->comments[i].entry) {
219 if(block->comments[i].entry != blockcopy->comments[i].entry) {
220 printf("FAILED, comments[%u].entry mismatch\n", i);
225 if(0 != memcmp(blockcopy->comments[i].entry, block->comments[i].entry, block->comments[i].length)) {
226 printf("FAILED, comments[%u].entry mismatch\n", i);
234 FLAC__bool mutils__compare_block_data_cuesheet(const FLAC__StreamMetadata_CueSheet *block, const FLAC__StreamMetadata_CueSheet *blockcopy)
238 if(0 != strcmp(blockcopy->media_catalog_number, block->media_catalog_number)) {
239 printf("FAILED, media_catalog_number mismatch, expected %s, got %s\n", block->media_catalog_number, blockcopy->media_catalog_number);
242 if(blockcopy->lead_in != block->lead_in) {
244 printf("FAILED, lead_in mismatch, expected %I64u, got %I64u\n", block->lead_in, blockcopy->lead_in);
246 printf("FAILED, lead_in mismatch, expected %llu, got %llu\n", (unsigned long long)block->lead_in, (unsigned long long)blockcopy->lead_in);
250 if(blockcopy->is_cd != block->is_cd) {
251 printf("FAILED, is_cd mismatch, expected %u, got %u\n", (unsigned)block->is_cd, (unsigned)blockcopy->is_cd);
254 if(blockcopy->num_tracks != block->num_tracks) {
255 printf("FAILED, num_tracks mismatch, expected %u, got %u\n", block->num_tracks, blockcopy->num_tracks);
258 for(i = 0; i < block->num_tracks; i++) {
259 if(blockcopy->tracks[i].offset != block->tracks[i].offset) {
261 printf("FAILED, tracks[%u].offset mismatch, expected %I64u, got %I64u\n", i, block->tracks[i].offset, blockcopy->tracks[i].offset);
263 printf("FAILED, tracks[%u].offset mismatch, expected %llu, got %llu\n", i, (unsigned long long)block->tracks[i].offset, (unsigned long long)blockcopy->tracks[i].offset);
267 if(blockcopy->tracks[i].number != block->tracks[i].number) {
268 printf("FAILED, tracks[%u].number mismatch, expected %u, got %u\n", i, (unsigned)block->tracks[i].number, (unsigned)blockcopy->tracks[i].number);
271 if(blockcopy->tracks[i].num_indices != block->tracks[i].num_indices) {
272 printf("FAILED, tracks[%u].num_indices mismatch, expected %u, got %u\n", i, (unsigned)block->tracks[i].num_indices, (unsigned)blockcopy->tracks[i].num_indices);
275 /* num_indices == 0 means lead-out track so only the track offset and number are valid */
276 if(block->tracks[i].num_indices > 0) {
277 if(0 != strcmp(blockcopy->tracks[i].isrc, block->tracks[i].isrc)) {
278 printf("FAILED, tracks[%u].isrc mismatch, expected %s, got %s\n", i, block->tracks[i].isrc, blockcopy->tracks[i].isrc);
281 if(blockcopy->tracks[i].type != block->tracks[i].type) {
282 printf("FAILED, tracks[%u].type mismatch, expected %u, got %u\n", i, (unsigned)block->tracks[i].type, (unsigned)blockcopy->tracks[i].type);
285 if(blockcopy->tracks[i].pre_emphasis != block->tracks[i].pre_emphasis) {
286 printf("FAILED, tracks[%u].pre_emphasis mismatch, expected %u, got %u\n", i, (unsigned)block->tracks[i].pre_emphasis, (unsigned)blockcopy->tracks[i].pre_emphasis);
289 if(0 == block->tracks[i].indices || 0 == blockcopy->tracks[i].indices) {
290 if(block->tracks[i].indices != blockcopy->tracks[i].indices) {
291 printf("FAILED, tracks[%u].indices mismatch\n", i);
296 for(j = 0; j < block->tracks[i].num_indices; j++) {
297 if(blockcopy->tracks[i].indices[j].offset != block->tracks[i].indices[j].offset) {
299 printf("FAILED, tracks[%u].indices[%u].offset mismatch, expected %I64u, got %I64u\n", i, j, block->tracks[i].indices[j].offset, blockcopy->tracks[i].indices[j].offset);
301 printf("FAILED, tracks[%u].indices[%u].offset mismatch, expected %llu, got %llu\n", i, j, (unsigned long long)block->tracks[i].indices[j].offset, (unsigned long long)blockcopy->tracks[i].indices[j].offset);
305 if(blockcopy->tracks[i].indices[j].number != block->tracks[i].indices[j].number) {
306 printf("FAILED, tracks[%u].indices[%u].number mismatch, expected %u, got %u\n", i, j, (unsigned)block->tracks[i].indices[j].number, (unsigned)blockcopy->tracks[i].indices[j].number);
316 FLAC__bool mutils__compare_block_data_picture(const FLAC__StreamMetadata_Picture *block, const FLAC__StreamMetadata_Picture *blockcopy)
319 if(blockcopy->type != block->type) {
320 printf("FAILED, type mismatch, expected %u, got %u\n", (unsigned)block->type, (unsigned)blockcopy->type);
323 len = strlen(block->mime_type);
324 lencopy = strlen(blockcopy->mime_type);
326 printf("FAILED, mime_type length mismatch, expected %u, got %u\n", (unsigned)len, (unsigned)lencopy);
329 if(strcmp(blockcopy->mime_type, block->mime_type)) {
330 printf("FAILED, mime_type mismatch, expected %s, got %s\n", block->mime_type, blockcopy->mime_type);
333 len = strlen((const char *)block->description);
334 lencopy = strlen((const char *)blockcopy->description);
336 printf("FAILED, description length mismatch, expected %u, got %u\n", (unsigned)len, (unsigned)lencopy);
339 if(strcmp((const char *)blockcopy->description, (const char *)block->description)) {
340 printf("FAILED, description mismatch, expected %s, got %s\n", block->description, blockcopy->description);
343 if(blockcopy->width != block->width) {
344 printf("FAILED, width mismatch, expected %u, got %u\n", block->width, blockcopy->width);
347 if(blockcopy->height != block->height) {
348 printf("FAILED, height mismatch, expected %u, got %u\n", block->height, blockcopy->height);
351 if(blockcopy->depth != block->depth) {
352 printf("FAILED, depth mismatch, expected %u, got %u\n", block->depth, blockcopy->depth);
355 if(blockcopy->colors != block->colors) {
356 printf("FAILED, colors mismatch, expected %u, got %u\n", block->colors, blockcopy->colors);
359 if(blockcopy->data_length != block->data_length) {
360 printf("FAILED, data_length mismatch, expected %u, got %u\n", block->data_length, blockcopy->data_length);
363 if(memcmp(blockcopy->data, block->data, block->data_length)) {
364 printf("FAILED, data mismatch\n");
370 FLAC__bool mutils__compare_block_data_unknown(const FLAC__StreamMetadata_Unknown *block, const FLAC__StreamMetadata_Unknown *blockcopy, unsigned block_length)
372 if(0 == block->data || 0 == blockcopy->data) {
373 if(block->data != blockcopy->data) {
374 printf("FAILED, data mismatch (%s's data pointer is null)\n", 0==block->data?"original":"copy");
377 else if(block_length > 0) {
378 printf("FAILED, data pointer is null but block length is not 0\n");
383 if(block_length == 0) {
384 printf("FAILED, data pointer is not null but block length is 0\n");
387 else if(0 != memcmp(blockcopy->data, block->data, block_length)) {
388 printf("FAILED, data mismatch\n");
395 FLAC__bool mutils__compare_block(const FLAC__StreamMetadata *block, const FLAC__StreamMetadata *blockcopy)
397 if(blockcopy->type != block->type) {
398 printf("FAILED, type mismatch, expected %s, got %s\n", FLAC__MetadataTypeString[block->type], FLAC__MetadataTypeString[blockcopy->type]);
401 if(blockcopy->is_last != block->is_last) {
402 printf("FAILED, is_last mismatch, expected %u, got %u\n", (unsigned)block->is_last, (unsigned)blockcopy->is_last);
405 if(blockcopy->length != block->length) {
406 printf("FAILED, length mismatch, expected %u, got %u\n", block->length, blockcopy->length);
409 switch(block->type) {
410 case FLAC__METADATA_TYPE_STREAMINFO:
411 return mutils__compare_block_data_streaminfo(&block->data.stream_info, &blockcopy->data.stream_info);
412 case FLAC__METADATA_TYPE_PADDING:
413 return mutils__compare_block_data_padding(&block->data.padding, &blockcopy->data.padding, block->length);
414 case FLAC__METADATA_TYPE_APPLICATION:
415 return mutils__compare_block_data_application(&block->data.application, &blockcopy->data.application, block->length);
416 case FLAC__METADATA_TYPE_SEEKTABLE:
417 return mutils__compare_block_data_seektable(&block->data.seek_table, &blockcopy->data.seek_table);
418 case FLAC__METADATA_TYPE_VORBIS_COMMENT:
419 return mutils__compare_block_data_vorbiscomment(&block->data.vorbis_comment, &blockcopy->data.vorbis_comment);
420 case FLAC__METADATA_TYPE_CUESHEET:
421 return mutils__compare_block_data_cuesheet(&block->data.cue_sheet, &blockcopy->data.cue_sheet);
422 case FLAC__METADATA_TYPE_PICTURE:
423 return mutils__compare_block_data_picture(&block->data.picture, &blockcopy->data.picture);
425 return mutils__compare_block_data_unknown(&block->data.unknown, &blockcopy->data.unknown, block->length);
429 static void *malloc_or_die_(size_t size)
431 void *x = malloc(size);
433 fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)size);
439 static void *calloc_or_die_(size_t n, size_t size)
441 void *x = calloc(n, size);
443 fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)n * (unsigned)size);
449 static char *strdup_or_die_(const char *s)
453 fprintf(stderr, "ERROR: out of memory copying string \"%s\"\n", s);
459 void mutils__init_metadata_blocks(
460 FLAC__StreamMetadata *streaminfo,
461 FLAC__StreamMetadata *padding,
462 FLAC__StreamMetadata *seektable,
463 FLAC__StreamMetadata *application1,
464 FLAC__StreamMetadata *application2,
465 FLAC__StreamMetadata *vorbiscomment,
466 FLAC__StreamMetadata *cuesheet,
467 FLAC__StreamMetadata *picture,
468 FLAC__StreamMetadata *unknown
472 most of the actual numbers and data in the blocks don't matter,
473 we just want to make sure the decoder parses them correctly
475 remember, the metadata interface gets tested after the decoders,
476 so we do all the metadata manipulation here without it.
479 /* min/max_framesize and md5sum don't get written at first, so we have to leave them 0 */
480 streaminfo->is_last = false;
481 streaminfo->type = FLAC__METADATA_TYPE_STREAMINFO;
482 streaminfo->length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
483 streaminfo->data.stream_info.min_blocksize = 576;
484 streaminfo->data.stream_info.max_blocksize = 576;
485 streaminfo->data.stream_info.min_framesize = 0;
486 streaminfo->data.stream_info.max_framesize = 0;
487 streaminfo->data.stream_info.sample_rate = 44100;
488 streaminfo->data.stream_info.channels = 1;
489 streaminfo->data.stream_info.bits_per_sample = 8;
490 streaminfo->data.stream_info.total_samples = 0;
491 memset(streaminfo->data.stream_info.md5sum, 0, 16);
493 padding->is_last = false;
494 padding->type = FLAC__METADATA_TYPE_PADDING;
495 padding->length = 1234;
497 seektable->is_last = false;
498 seektable->type = FLAC__METADATA_TYPE_SEEKTABLE;
499 seektable->data.seek_table.num_points = 2;
500 seektable->length = seektable->data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
501 seektable->data.seek_table.points = (FLAC__StreamMetadata_SeekPoint*)malloc_or_die_(seektable->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint));
502 seektable->data.seek_table.points[0].sample_number = 0;
503 seektable->data.seek_table.points[0].stream_offset = 0;
504 seektable->data.seek_table.points[0].frame_samples = streaminfo->data.stream_info.min_blocksize;
505 seektable->data.seek_table.points[1].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
506 seektable->data.seek_table.points[1].stream_offset = 1000;
507 seektable->data.seek_table.points[1].frame_samples = streaminfo->data.stream_info.min_blocksize;
509 application1->is_last = false;
510 application1->type = FLAC__METADATA_TYPE_APPLICATION;
511 application1->length = 8;
512 memcpy(application1->data.application.id, "\xfe\xdc\xba\x98", 4);
513 application1->data.application.data = (FLAC__byte*)malloc_or_die_(4);
514 memcpy(application1->data.application.data, "\xf0\xe1\xd2\xc3", 4);
516 application2->is_last = false;
517 application2->type = FLAC__METADATA_TYPE_APPLICATION;
518 application2->length = 4;
519 memcpy(application2->data.application.id, "\x76\x54\x32\x10", 4);
520 application2->data.application.data = 0;
523 const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING);
524 vorbiscomment->is_last = false;
525 vorbiscomment->type = FLAC__METADATA_TYPE_VORBIS_COMMENT;
526 vorbiscomment->length = (4 + vendor_string_length) + 4 + (4 + 5) + (4 + 0);
527 vorbiscomment->data.vorbis_comment.vendor_string.length = vendor_string_length;
528 vorbiscomment->data.vorbis_comment.vendor_string.entry = (FLAC__byte*)malloc_or_die_(vendor_string_length+1);
529 memcpy(vorbiscomment->data.vorbis_comment.vendor_string.entry, FLAC__VENDOR_STRING, vendor_string_length+1);
530 vorbiscomment->data.vorbis_comment.num_comments = 2;
531 vorbiscomment->data.vorbis_comment.comments = (FLAC__StreamMetadata_VorbisComment_Entry*)malloc_or_die_(vorbiscomment->data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry));
532 vorbiscomment->data.vorbis_comment.comments[0].length = 5;
533 vorbiscomment->data.vorbis_comment.comments[0].entry = (FLAC__byte*)malloc_or_die_(5+1);
534 memcpy(vorbiscomment->data.vorbis_comment.comments[0].entry, "ab=cd", 5+1);
535 vorbiscomment->data.vorbis_comment.comments[1].length = 0;
536 vorbiscomment->data.vorbis_comment.comments[1].entry = 0;
539 cuesheet->is_last = false;
540 cuesheet->type = FLAC__METADATA_TYPE_CUESHEET;
544 FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN +
545 FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN +
546 FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN +
547 FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN +
548 FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN
552 FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN +
553 FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN +
554 FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN +
555 FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN +
556 FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN +
557 FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN +
558 FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN
562 FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN +
563 FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN +
564 FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN
567 memset(cuesheet->data.cue_sheet.media_catalog_number, 0, sizeof(cuesheet->data.cue_sheet.media_catalog_number));
568 cuesheet->data.cue_sheet.media_catalog_number[0] = 'j';
569 cuesheet->data.cue_sheet.media_catalog_number[1] = 'C';
570 cuesheet->data.cue_sheet.lead_in = 2 * 44100;
571 cuesheet->data.cue_sheet.is_cd = true;
572 cuesheet->data.cue_sheet.num_tracks = 3;
573 cuesheet->data.cue_sheet.tracks = (FLAC__StreamMetadata_CueSheet_Track*)calloc_or_die_(cuesheet->data.cue_sheet.num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track));
574 cuesheet->data.cue_sheet.tracks[0].offset = 0;
575 cuesheet->data.cue_sheet.tracks[0].number = 1;
576 memcpy(cuesheet->data.cue_sheet.tracks[0].isrc, "ACBDE1234567", sizeof(cuesheet->data.cue_sheet.tracks[0].isrc));
577 cuesheet->data.cue_sheet.tracks[0].type = 0;
578 cuesheet->data.cue_sheet.tracks[0].pre_emphasis = 1;
579 cuesheet->data.cue_sheet.tracks[0].num_indices = 2;
580 cuesheet->data.cue_sheet.tracks[0].indices = (FLAC__StreamMetadata_CueSheet_Index*)malloc_or_die_(cuesheet->data.cue_sheet.tracks[0].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
581 cuesheet->data.cue_sheet.tracks[0].indices[0].offset = 0;
582 cuesheet->data.cue_sheet.tracks[0].indices[0].number = 0;
583 cuesheet->data.cue_sheet.tracks[0].indices[1].offset = 123 * 588;
584 cuesheet->data.cue_sheet.tracks[0].indices[1].number = 1;
585 cuesheet->data.cue_sheet.tracks[1].offset = 1234 * 588;
586 cuesheet->data.cue_sheet.tracks[1].number = 2;
587 memcpy(cuesheet->data.cue_sheet.tracks[1].isrc, "ACBDE7654321", sizeof(cuesheet->data.cue_sheet.tracks[1].isrc));
588 cuesheet->data.cue_sheet.tracks[1].type = 1;
589 cuesheet->data.cue_sheet.tracks[1].pre_emphasis = 0;
590 cuesheet->data.cue_sheet.tracks[1].num_indices = 1;
591 cuesheet->data.cue_sheet.tracks[1].indices = (FLAC__StreamMetadata_CueSheet_Index*)malloc_or_die_(cuesheet->data.cue_sheet.tracks[1].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
592 cuesheet->data.cue_sheet.tracks[1].indices[0].offset = 0;
593 cuesheet->data.cue_sheet.tracks[1].indices[0].number = 1;
594 cuesheet->data.cue_sheet.tracks[2].offset = 12345 * 588;
595 cuesheet->data.cue_sheet.tracks[2].number = 170;
596 cuesheet->data.cue_sheet.tracks[2].num_indices = 0;
598 picture->is_last = false;
599 picture->type = FLAC__METADATA_TYPE_PICTURE;
602 FLAC__STREAM_METADATA_PICTURE_TYPE_LEN +
603 FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* will add the length for the string later */
604 FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* will add the length for the string later */
605 FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN +
606 FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN +
607 FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN +
608 FLAC__STREAM_METADATA_PICTURE_COLORS_LEN +
609 FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN /* will add the length for the data later */
612 picture->data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER;
613 picture->data.picture.mime_type = strdup_or_die_("image/jpeg");
614 picture->length += strlen(picture->data.picture.mime_type);
615 picture->data.picture.description = (FLAC__byte*)strdup_or_die_("desc");
616 picture->length += strlen((const char *)picture->data.picture.description);
617 picture->data.picture.width = 300;
618 picture->data.picture.height = 300;
619 picture->data.picture.depth = 24;
620 picture->data.picture.colors = 0;
621 picture->data.picture.data = (FLAC__byte*)strdup_or_die_("SOMEJPEGDATA");
622 picture->data.picture.data_length = strlen((const char *)picture->data.picture.data);
623 picture->length += picture->data.picture.data_length;
625 unknown->is_last = true;
628 unknown->data.unknown.data = (FLAC__byte*)malloc_or_die_(unknown->length);
629 memcpy(unknown->data.unknown.data, "\xfe\xdc\xba\x98\xf0\xe1\xd2\xc3", unknown->length);
632 void mutils__free_metadata_blocks(
633 FLAC__StreamMetadata *streaminfo,
634 FLAC__StreamMetadata *padding,
635 FLAC__StreamMetadata *seektable,
636 FLAC__StreamMetadata *application1,
637 FLAC__StreamMetadata *application2,
638 FLAC__StreamMetadata *vorbiscomment,
639 FLAC__StreamMetadata *cuesheet,
640 FLAC__StreamMetadata *picture,
641 FLAC__StreamMetadata *unknown
644 (void)streaminfo, (void)padding, (void)application2;
645 free(seektable->data.seek_table.points);
646 free(application1->data.application.data);
647 free(vorbiscomment->data.vorbis_comment.vendor_string.entry);
648 free(vorbiscomment->data.vorbis_comment.comments[0].entry);
649 free(vorbiscomment->data.vorbis_comment.comments);
650 free(cuesheet->data.cue_sheet.tracks[0].indices);
651 free(cuesheet->data.cue_sheet.tracks[1].indices);
652 free(cuesheet->data.cue_sheet.tracks);
653 free(picture->data.picture.mime_type);
654 free(picture->data.picture.description);
655 free(picture->data.picture.data);
656 free(unknown->data.unknown.data);