Blame src/test_libs_common/metadata_utils.c

Packit 8f7830
/* test_libFLAC - Unit tester for libFLAC
Packit 8f7830
 * Copyright (C) 2002-2009  Josh Coalson
Packit 8f7830
 * Copyright (C) 2011-2016  Xiph.Org Foundation
Packit 8f7830
 *
Packit 8f7830
 * This program is free software; you can redistribute it and/or
Packit 8f7830
 * modify it under the terms of the GNU General Public License
Packit 8f7830
 * as published by the Free Software Foundation; either version 2
Packit 8f7830
 * of the License, or (at your option) any later version.
Packit 8f7830
 *
Packit 8f7830
 * This program is distributed in the hope that it will be useful,
Packit 8f7830
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8f7830
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 8f7830
 * GNU General Public License for more details.
Packit 8f7830
 *
Packit 8f7830
 * You should have received a copy of the GNU General Public License along
Packit 8f7830
 * with this program; if not, write to the Free Software Foundation, Inc.,
Packit 8f7830
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit 8f7830
 */
Packit 8f7830
Packit 8f7830
/*
Packit 8f7830
 * These are not tests, just utility functions used by the metadata tests
Packit 8f7830
 */
Packit 8f7830
Packit 8f7830
#ifdef HAVE_CONFIG_H
Packit 8f7830
#  include <config.h>
Packit 8f7830
#endif
Packit 8f7830
Packit 8f7830
#include "FLAC/metadata.h"
Packit 8f7830
#include "test_libs_common/metadata_utils.h"
Packit 8f7830
#include "share/compat.h"
Packit 8f7830
#include <stdio.h>
Packit 8f7830
#include <stdlib.h> /* for malloc() */
Packit 8f7830
#include <string.h> /* for memcmp() */
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_streaminfo(const FLAC__StreamMetadata_StreamInfo *block, const FLAC__StreamMetadata_StreamInfo *blockcopy)
Packit 8f7830
{
Packit 8f7830
	if(blockcopy->min_blocksize != block->min_blocksize) {
Packit 8f7830
		printf("FAILED, min_blocksize mismatch, expected %u, got %u\n", block->min_blocksize, blockcopy->min_blocksize);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->max_blocksize != block->max_blocksize) {
Packit 8f7830
		printf("FAILED, max_blocksize mismatch, expected %u, got %u\n", block->max_blocksize, blockcopy->max_blocksize);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->min_framesize != block->min_framesize) {
Packit 8f7830
		printf("FAILED, min_framesize mismatch, expected %u, got %u\n", block->min_framesize, blockcopy->min_framesize);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->max_framesize != block->max_framesize) {
Packit 8f7830
		printf("FAILED, max_framesize mismatch, expected %u, got %u\n", block->max_framesize, blockcopy->max_framesize);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->sample_rate != block->sample_rate) {
Packit 8f7830
		printf("FAILED, sample_rate mismatch, expected %u, got %u\n", block->sample_rate, blockcopy->sample_rate);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->channels != block->channels) {
Packit 8f7830
		printf("FAILED, channels mismatch, expected %u, got %u\n", block->channels, blockcopy->channels);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->bits_per_sample != block->bits_per_sample) {
Packit 8f7830
		printf("FAILED, bits_per_sample mismatch, expected %u, got %u\n", block->bits_per_sample, blockcopy->bits_per_sample);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->total_samples != block->total_samples) {
Packit 8f7830
		printf("FAILED, total_samples mismatch, expected %" PRIu64 ", got %" PRIu64 "\n", block->total_samples, blockcopy->total_samples);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(0 != memcmp(blockcopy->md5sum, block->md5sum, sizeof(block->md5sum))) {
Packit 8f7830
		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",
Packit 8f7830
			(unsigned)block->md5sum[0],
Packit 8f7830
			(unsigned)block->md5sum[1],
Packit 8f7830
			(unsigned)block->md5sum[2],
Packit 8f7830
			(unsigned)block->md5sum[3],
Packit 8f7830
			(unsigned)block->md5sum[4],
Packit 8f7830
			(unsigned)block->md5sum[5],
Packit 8f7830
			(unsigned)block->md5sum[6],
Packit 8f7830
			(unsigned)block->md5sum[7],
Packit 8f7830
			(unsigned)block->md5sum[8],
Packit 8f7830
			(unsigned)block->md5sum[9],
Packit 8f7830
			(unsigned)block->md5sum[10],
Packit 8f7830
			(unsigned)block->md5sum[11],
Packit 8f7830
			(unsigned)block->md5sum[12],
Packit 8f7830
			(unsigned)block->md5sum[13],
Packit 8f7830
			(unsigned)block->md5sum[14],
Packit 8f7830
			(unsigned)block->md5sum[15],
Packit 8f7830
			(unsigned)blockcopy->md5sum[0],
Packit 8f7830
			(unsigned)blockcopy->md5sum[1],
Packit 8f7830
			(unsigned)blockcopy->md5sum[2],
Packit 8f7830
			(unsigned)blockcopy->md5sum[3],
Packit 8f7830
			(unsigned)blockcopy->md5sum[4],
Packit 8f7830
			(unsigned)blockcopy->md5sum[5],
Packit 8f7830
			(unsigned)blockcopy->md5sum[6],
Packit 8f7830
			(unsigned)blockcopy->md5sum[7],
Packit 8f7830
			(unsigned)blockcopy->md5sum[8],
Packit 8f7830
			(unsigned)blockcopy->md5sum[9],
Packit 8f7830
			(unsigned)blockcopy->md5sum[10],
Packit 8f7830
			(unsigned)blockcopy->md5sum[11],
Packit 8f7830
			(unsigned)blockcopy->md5sum[12],
Packit 8f7830
			(unsigned)blockcopy->md5sum[13],
Packit 8f7830
			(unsigned)blockcopy->md5sum[14],
Packit 8f7830
			(unsigned)blockcopy->md5sum[15]
Packit 8f7830
		);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_padding(const FLAC__StreamMetadata_Padding *block, const FLAC__StreamMetadata_Padding *blockcopy, unsigned block_length)
Packit 8f7830
{
Packit 8f7830
	/* we don't compare the padding guts */
Packit 8f7830
	(void)block, (void)blockcopy, (void)block_length;
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_application(const FLAC__StreamMetadata_Application *block, const FLAC__StreamMetadata_Application *blockcopy, unsigned block_length)
Packit 8f7830
{
Packit 8f7830
	if(block_length < sizeof(block->id)) {
Packit 8f7830
		printf("FAILED, bad block length = %u\n", block_length);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(0 != memcmp(blockcopy->id, block->id, sizeof(block->id))) {
Packit 8f7830
		printf("FAILED, id mismatch, expected %02X%02X%02X%02X, got %02X%02X%02X%02X\n",
Packit 8f7830
			(unsigned)block->id[0],
Packit 8f7830
			(unsigned)block->id[1],
Packit 8f7830
			(unsigned)block->id[2],
Packit 8f7830
			(unsigned)block->id[3],
Packit 8f7830
			(unsigned)blockcopy->id[0],
Packit 8f7830
			(unsigned)blockcopy->id[1],
Packit 8f7830
			(unsigned)blockcopy->id[2],
Packit 8f7830
			(unsigned)blockcopy->id[3]
Packit 8f7830
		);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(0 == block->data || 0 == blockcopy->data) {
Packit 8f7830
		if(block->data != blockcopy->data) {
Packit 8f7830
			printf("FAILED, data mismatch (%s's data pointer is null)\n", 0==block->data?"original":"copy");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		else if(block_length - sizeof(block->id) > 0) {
Packit 8f7830
			printf("FAILED, data pointer is null but block length is not 0\n");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	else {
Packit 8f7830
		if(block_length - sizeof(block->id) == 0) {
Packit 8f7830
			printf("FAILED, data pointer is not null but block length is 0\n");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		else if(0 != memcmp(blockcopy->data, block->data, block_length - sizeof(block->id))) {
Packit 8f7830
			printf("FAILED, data mismatch\n");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_seektable(const FLAC__StreamMetadata_SeekTable *block, const FLAC__StreamMetadata_SeekTable *blockcopy)
Packit 8f7830
{
Packit 8f7830
	unsigned i;
Packit 8f7830
	if(blockcopy->num_points != block->num_points) {
Packit 8f7830
		printf("FAILED, num_points mismatch, expected %u, got %u\n", block->num_points, blockcopy->num_points);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	for(i = 0; i < block->num_points; i++) {
Packit 8f7830
		if(blockcopy->points[i].sample_number != block->points[i].sample_number) {
Packit 8f7830
			printf("FAILED, points[%u].sample_number mismatch, expected %" PRIu64 ", got %" PRIu64 "\n", i, block->points[i].sample_number, blockcopy->points[i].sample_number);
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		if(blockcopy->points[i].stream_offset != block->points[i].stream_offset) {
Packit 8f7830
			printf("FAILED, points[%u].stream_offset mismatch, expected %" PRIu64 ", got %" PRIu64 "\n", i, block->points[i].stream_offset, blockcopy->points[i].stream_offset);
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		if(blockcopy->points[i].frame_samples != block->points[i].frame_samples) {
Packit 8f7830
			printf("FAILED, points[%u].frame_samples mismatch, expected %u, got %u\n", i, block->points[i].frame_samples, blockcopy->points[i].frame_samples);
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_vorbiscomment(const FLAC__StreamMetadata_VorbisComment *block, const FLAC__StreamMetadata_VorbisComment *blockcopy)
Packit 8f7830
{
Packit 8f7830
	unsigned i;
Packit 8f7830
	if(blockcopy->vendor_string.length != block->vendor_string.length) {
Packit 8f7830
		printf("FAILED, vendor_string.length mismatch, expected %u, got %u\n", block->vendor_string.length, blockcopy->vendor_string.length);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(0 == block->vendor_string.entry || 0 == blockcopy->vendor_string.entry) {
Packit 8f7830
		if(block->vendor_string.entry != blockcopy->vendor_string.entry) {
Packit 8f7830
			printf("FAILED, vendor_string.entry mismatch\n");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	else if(0 != memcmp(blockcopy->vendor_string.entry, block->vendor_string.entry, block->vendor_string.length)) {
Packit 8f7830
		printf("FAILED, vendor_string.entry mismatch\n");
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->num_comments != block->num_comments) {
Packit 8f7830
		printf("FAILED, num_comments mismatch, expected %u, got %u\n", block->num_comments, blockcopy->num_comments);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	for(i = 0; i < block->num_comments; i++) {
Packit 8f7830
		if(blockcopy->comments[i].length != block->comments[i].length) {
Packit 8f7830
			printf("FAILED, comments[%u].length mismatch, expected %u, got %u\n", i, block->comments[i].length, blockcopy->comments[i].length);
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		if(0 == block->comments[i].entry || 0 == blockcopy->comments[i].entry) {
Packit 8f7830
			if(block->comments[i].entry != blockcopy->comments[i].entry) {
Packit 8f7830
				printf("FAILED, comments[%u].entry mismatch\n", i);
Packit 8f7830
				return false;
Packit 8f7830
			}
Packit 8f7830
		}
Packit 8f7830
		else {
Packit 8f7830
			if(0 != memcmp(blockcopy->comments[i].entry, block->comments[i].entry, block->comments[i].length)) {
Packit 8f7830
				printf("FAILED, comments[%u].entry mismatch\n", i);
Packit 8f7830
				return false;
Packit 8f7830
			}
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_cuesheet(const FLAC__StreamMetadata_CueSheet *block, const FLAC__StreamMetadata_CueSheet *blockcopy)
Packit 8f7830
{
Packit 8f7830
	unsigned i, j;
Packit 8f7830
Packit 8f7830
	if(0 != strcmp(blockcopy->media_catalog_number, block->media_catalog_number)) {
Packit 8f7830
		printf("FAILED, media_catalog_number mismatch, expected %s, got %s\n", block->media_catalog_number, blockcopy->media_catalog_number);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->lead_in != block->lead_in) {
Packit 8f7830
		printf("FAILED, lead_in mismatch, expected %" PRIu64 ", got %" PRIu64 "\n", block->lead_in, blockcopy->lead_in);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->is_cd != block->is_cd) {
Packit 8f7830
		printf("FAILED, is_cd mismatch, expected %u, got %u\n", (unsigned)block->is_cd, (unsigned)blockcopy->is_cd);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->num_tracks != block->num_tracks) {
Packit 8f7830
		printf("FAILED, num_tracks mismatch, expected %u, got %u\n", block->num_tracks, blockcopy->num_tracks);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	for(i = 0; i < block->num_tracks; i++) {
Packit 8f7830
		if(blockcopy->tracks[i].offset != block->tracks[i].offset) {
Packit 8f7830
			printf("FAILED, tracks[%u].offset mismatch, expected %" PRIu64 ", got %" PRIu64 "\n", i, block->tracks[i].offset, blockcopy->tracks[i].offset);
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		if(blockcopy->tracks[i].number != block->tracks[i].number) {
Packit 8f7830
			printf("FAILED, tracks[%u].number mismatch, expected %u, got %u\n", i, (unsigned)block->tracks[i].number, (unsigned)blockcopy->tracks[i].number);
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		if(blockcopy->tracks[i].num_indices != block->tracks[i].num_indices) {
Packit 8f7830
			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);
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		/* num_indices == 0 means lead-out track so only the track offset and number are valid */
Packit 8f7830
		if(block->tracks[i].num_indices > 0) {
Packit 8f7830
			if(0 != strcmp(blockcopy->tracks[i].isrc, block->tracks[i].isrc)) {
Packit 8f7830
				printf("FAILED, tracks[%u].isrc mismatch, expected %s, got %s\n", i, block->tracks[i].isrc, blockcopy->tracks[i].isrc);
Packit 8f7830
				return false;
Packit 8f7830
			}
Packit 8f7830
			if(blockcopy->tracks[i].type != block->tracks[i].type) {
Packit 8f7830
				printf("FAILED, tracks[%u].type mismatch, expected %u, got %u\n", i, (unsigned)block->tracks[i].type, (unsigned)blockcopy->tracks[i].type);
Packit 8f7830
				return false;
Packit 8f7830
			}
Packit 8f7830
			if(blockcopy->tracks[i].pre_emphasis != block->tracks[i].pre_emphasis) {
Packit 8f7830
				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);
Packit 8f7830
				return false;
Packit 8f7830
			}
Packit 8f7830
			if(0 == block->tracks[i].indices || 0 == blockcopy->tracks[i].indices) {
Packit 8f7830
				if(block->tracks[i].indices != blockcopy->tracks[i].indices) {
Packit 8f7830
					printf("FAILED, tracks[%u].indices mismatch\n", i);
Packit 8f7830
					return false;
Packit 8f7830
				}
Packit 8f7830
			}
Packit 8f7830
			else {
Packit 8f7830
				for(j = 0; j < block->tracks[i].num_indices; j++) {
Packit 8f7830
					if(blockcopy->tracks[i].indices[j].offset != block->tracks[i].indices[j].offset) {
Packit 8f7830
						printf("FAILED, tracks[%u].indices[%u].offset mismatch, expected %" PRIu64 ", got %" PRIu64 "\n", i, j, block->tracks[i].indices[j].offset, blockcopy->tracks[i].indices[j].offset);
Packit 8f7830
						return false;
Packit 8f7830
					}
Packit 8f7830
					if(blockcopy->tracks[i].indices[j].number != block->tracks[i].indices[j].number) {
Packit 8f7830
						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);
Packit 8f7830
						return false;
Packit 8f7830
					}
Packit 8f7830
				}
Packit 8f7830
			}
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_picture(const FLAC__StreamMetadata_Picture *block, const FLAC__StreamMetadata_Picture *blockcopy)
Packit 8f7830
{
Packit 8f7830
	size_t len, lencopy;
Packit 8f7830
	if(blockcopy->type != block->type) {
Packit 8f7830
		printf("FAILED, type mismatch, expected %u, got %u\n", (unsigned)block->type, (unsigned)blockcopy->type);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	len = strlen(block->mime_type);
Packit 8f7830
	lencopy = strlen(blockcopy->mime_type);
Packit 8f7830
	if(lencopy != len) {
Packit 8f7830
		printf("FAILED, mime_type length mismatch, expected %u, got %u\n", (unsigned)len, (unsigned)lencopy);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(strcmp(blockcopy->mime_type, block->mime_type)) {
Packit 8f7830
		printf("FAILED, mime_type mismatch, expected %s, got %s\n", block->mime_type, blockcopy->mime_type);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	len = strlen((const char *)block->description);
Packit 8f7830
	lencopy = strlen((const char *)blockcopy->description);
Packit 8f7830
	if(lencopy != len) {
Packit 8f7830
		printf("FAILED, description length mismatch, expected %u, got %u\n", (unsigned)len, (unsigned)lencopy);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(strcmp((const char *)blockcopy->description, (const char *)block->description)) {
Packit 8f7830
		printf("FAILED, description mismatch, expected %s, got %s\n", block->description, blockcopy->description);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->width != block->width) {
Packit 8f7830
		printf("FAILED, width mismatch, expected %u, got %u\n", block->width, blockcopy->width);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->height != block->height) {
Packit 8f7830
		printf("FAILED, height mismatch, expected %u, got %u\n", block->height, blockcopy->height);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->depth != block->depth) {
Packit 8f7830
		printf("FAILED, depth mismatch, expected %u, got %u\n", block->depth, blockcopy->depth);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->colors != block->colors) {
Packit 8f7830
		printf("FAILED, colors mismatch, expected %u, got %u\n", block->colors, blockcopy->colors);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->data_length != block->data_length) {
Packit 8f7830
		printf("FAILED, data_length mismatch, expected %u, got %u\n", block->data_length, blockcopy->data_length);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(block->data_length > 0 && memcmp(blockcopy->data, block->data, block->data_length)) {
Packit 8f7830
		printf("FAILED, data mismatch\n");
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block_data_unknown(const FLAC__StreamMetadata_Unknown *block, const FLAC__StreamMetadata_Unknown *blockcopy, unsigned block_length)
Packit 8f7830
{
Packit 8f7830
	if(0 == block->data || 0 == blockcopy->data) {
Packit 8f7830
		if(block->data != blockcopy->data) {
Packit 8f7830
			printf("FAILED, data mismatch (%s's data pointer is null)\n", 0==block->data?"original":"copy");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		else if(block_length > 0) {
Packit 8f7830
			printf("FAILED, data pointer is null but block length is not 0\n");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	else {
Packit 8f7830
		if(block_length == 0) {
Packit 8f7830
			printf("FAILED, data pointer is not null but block length is 0\n");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
		else if(0 != memcmp(blockcopy->data, block->data, block_length)) {
Packit 8f7830
			printf("FAILED, data mismatch\n");
Packit 8f7830
			return false;
Packit 8f7830
		}
Packit 8f7830
	}
Packit 8f7830
	return true;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
FLAC__bool mutils__compare_block(const FLAC__StreamMetadata *block, const FLAC__StreamMetadata *blockcopy)
Packit 8f7830
{
Packit 8f7830
	if(blockcopy->type != block->type) {
Packit 8f7830
		printf("FAILED, type mismatch, expected %s, got %s\n", FLAC__MetadataTypeString[block->type], FLAC__MetadataTypeString[blockcopy->type]);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->is_last != block->is_last) {
Packit 8f7830
		printf("FAILED, is_last mismatch, expected %u, got %u\n", (unsigned)block->is_last, (unsigned)blockcopy->is_last);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	if(blockcopy->length != block->length) {
Packit 8f7830
		printf("FAILED, length mismatch, expected %u, got %u\n", block->length, blockcopy->length);
Packit 8f7830
		return false;
Packit 8f7830
	}
Packit 8f7830
	switch(block->type) {
Packit 8f7830
		case FLAC__METADATA_TYPE_STREAMINFO:
Packit 8f7830
			return mutils__compare_block_data_streaminfo(&block->data.stream_info, &blockcopy->data.stream_info);
Packit 8f7830
		case FLAC__METADATA_TYPE_PADDING:
Packit 8f7830
			return mutils__compare_block_data_padding(&block->data.padding, &blockcopy->data.padding, block->length);
Packit 8f7830
		case FLAC__METADATA_TYPE_APPLICATION:
Packit 8f7830
			return mutils__compare_block_data_application(&block->data.application, &blockcopy->data.application, block->length);
Packit 8f7830
		case FLAC__METADATA_TYPE_SEEKTABLE:
Packit 8f7830
			return mutils__compare_block_data_seektable(&block->data.seek_table, &blockcopy->data.seek_table);
Packit 8f7830
		case FLAC__METADATA_TYPE_VORBIS_COMMENT:
Packit 8f7830
			return mutils__compare_block_data_vorbiscomment(&block->data.vorbis_comment, &blockcopy->data.vorbis_comment);
Packit 8f7830
		case FLAC__METADATA_TYPE_CUESHEET:
Packit 8f7830
			return mutils__compare_block_data_cuesheet(&block->data.cue_sheet, &blockcopy->data.cue_sheet);
Packit 8f7830
		case FLAC__METADATA_TYPE_PICTURE:
Packit 8f7830
			return mutils__compare_block_data_picture(&block->data.picture, &blockcopy->data.picture);
Packit 8f7830
		default:
Packit 8f7830
			return mutils__compare_block_data_unknown(&block->data.unknown, &blockcopy->data.unknown, block->length);
Packit 8f7830
	}
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
static void *malloc_or_die_(size_t size)
Packit 8f7830
{
Packit 8f7830
	void *x = malloc(size);
Packit 8f7830
	if(0 == x) {
Packit 8f7830
		fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)size);
Packit 8f7830
		exit(1);
Packit 8f7830
	}
Packit 8f7830
	return x;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
static void *calloc_or_die_(size_t n, size_t size)
Packit 8f7830
{
Packit 8f7830
	void *x = calloc(n, size);
Packit 8f7830
	if(0 == x) {
Packit 8f7830
		fprintf(stderr, "ERROR: out of memory allocating %u bytes\n", (unsigned)n * (unsigned)size);
Packit 8f7830
		exit(1);
Packit 8f7830
	}
Packit 8f7830
	return x;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
static char *strdup_or_die_(const char *s)
Packit 8f7830
{
Packit 8f7830
	char *x = strdup(s);
Packit 8f7830
	if(0 == x) {
Packit 8f7830
		fprintf(stderr, "ERROR: out of memory copying string \"%s\"\n", s);
Packit 8f7830
		exit(1);
Packit 8f7830
	}
Packit 8f7830
	return x;
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
void mutils__init_metadata_blocks(
Packit 8f7830
	FLAC__StreamMetadata *streaminfo,
Packit 8f7830
	FLAC__StreamMetadata *padding,
Packit 8f7830
	FLAC__StreamMetadata *seektable,
Packit 8f7830
	FLAC__StreamMetadata *application1,
Packit 8f7830
	FLAC__StreamMetadata *application2,
Packit 8f7830
	FLAC__StreamMetadata *vorbiscomment,
Packit 8f7830
	FLAC__StreamMetadata *cuesheet,
Packit 8f7830
	FLAC__StreamMetadata *picture,
Packit 8f7830
	FLAC__StreamMetadata *unknown
Packit 8f7830
)
Packit 8f7830
{
Packit 8f7830
	/*
Packit 8f7830
		most of the actual numbers and data in the blocks don't matter,
Packit 8f7830
		we just want to make sure the decoder parses them correctly
Packit 8f7830
Packit 8f7830
		remember, the metadata interface gets tested after the decoders,
Packit 8f7830
		so we do all the metadata manipulation here without it.
Packit 8f7830
	*/
Packit 8f7830
Packit 8f7830
	/* min/max_framesize and md5sum don't get written at first, so we have to leave them 0 */
Packit 8f7830
	streaminfo->is_last = false;
Packit 8f7830
	streaminfo->type = FLAC__METADATA_TYPE_STREAMINFO;
Packit 8f7830
	streaminfo->length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
Packit 8f7830
	streaminfo->data.stream_info.min_blocksize = 576;
Packit 8f7830
	streaminfo->data.stream_info.max_blocksize = 576;
Packit 8f7830
	streaminfo->data.stream_info.min_framesize = 0;
Packit 8f7830
	streaminfo->data.stream_info.max_framesize = 0;
Packit 8f7830
	streaminfo->data.stream_info.sample_rate = 44100;
Packit 8f7830
	streaminfo->data.stream_info.channels = 1;
Packit 8f7830
	streaminfo->data.stream_info.bits_per_sample = 8;
Packit 8f7830
	streaminfo->data.stream_info.total_samples = 0;
Packit 8f7830
	memset(streaminfo->data.stream_info.md5sum, 0, 16);
Packit 8f7830
Packit 8f7830
	padding->is_last = false;
Packit 8f7830
	padding->type = FLAC__METADATA_TYPE_PADDING;
Packit 8f7830
	padding->length = 1234;
Packit 8f7830
Packit 8f7830
	seektable->is_last = false;
Packit 8f7830
	seektable->type = FLAC__METADATA_TYPE_SEEKTABLE;
Packit 8f7830
	seektable->data.seek_table.num_points = 2;
Packit 8f7830
	seektable->length = seektable->data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
Packit 8f7830
	seektable->data.seek_table.points = malloc_or_die_(seektable->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint));
Packit 8f7830
	seektable->data.seek_table.points[0].sample_number = 0;
Packit 8f7830
	seektable->data.seek_table.points[0].stream_offset = 0;
Packit 8f7830
	seektable->data.seek_table.points[0].frame_samples = streaminfo->data.stream_info.min_blocksize;
Packit 8f7830
	seektable->data.seek_table.points[1].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
Packit 8f7830
	seektable->data.seek_table.points[1].stream_offset = 1000;
Packit 8f7830
	seektable->data.seek_table.points[1].frame_samples = streaminfo->data.stream_info.min_blocksize;
Packit 8f7830
Packit 8f7830
	application1->is_last = false;
Packit 8f7830
	application1->type = FLAC__METADATA_TYPE_APPLICATION;
Packit 8f7830
	application1->length = 8;
Packit 8f7830
	memcpy(application1->data.application.id, "This", 4);
Packit 8f7830
	application1->data.application.data = malloc_or_die_(4);
Packit 8f7830
	memcpy(application1->data.application.data, "\xf0\xe1\xd2\xc3", 4);
Packit 8f7830
Packit 8f7830
	application2->is_last = false;
Packit 8f7830
	application2->type = FLAC__METADATA_TYPE_APPLICATION;
Packit 8f7830
	application2->length = 4;
Packit 8f7830
	memcpy(application2->data.application.id, "Here", 4);
Packit 8f7830
	application2->data.application.data = 0;
Packit 8f7830
Packit 8f7830
	{
Packit 8f7830
		const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING);
Packit 8f7830
		vorbiscomment->is_last = false;
Packit 8f7830
		vorbiscomment->type = FLAC__METADATA_TYPE_VORBIS_COMMENT;
Packit 8f7830
		vorbiscomment->length = (4 + vendor_string_length) + 4 + (4 + 5) + (4 + 0);
Packit 8f7830
		vorbiscomment->data.vorbis_comment.vendor_string.length = vendor_string_length;
Packit 8f7830
		vorbiscomment->data.vorbis_comment.vendor_string.entry = malloc_or_die_(vendor_string_length+1);
Packit 8f7830
		memcpy(vorbiscomment->data.vorbis_comment.vendor_string.entry, FLAC__VENDOR_STRING, vendor_string_length+1);
Packit 8f7830
		vorbiscomment->data.vorbis_comment.num_comments = 2;
Packit 8f7830
		vorbiscomment->data.vorbis_comment.comments = malloc_or_die_(vorbiscomment->data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry));
Packit 8f7830
		vorbiscomment->data.vorbis_comment.comments[0].length = 5;
Packit 8f7830
		vorbiscomment->data.vorbis_comment.comments[0].entry = malloc_or_die_(5+1);
Packit 8f7830
		memcpy(vorbiscomment->data.vorbis_comment.comments[0].entry, "ab=cd", 5+1);
Packit 8f7830
		vorbiscomment->data.vorbis_comment.comments[1].length = 0;
Packit 8f7830
		vorbiscomment->data.vorbis_comment.comments[1].entry = 0;
Packit 8f7830
	}
Packit 8f7830
Packit 8f7830
	cuesheet->is_last = false;
Packit 8f7830
	cuesheet->type = FLAC__METADATA_TYPE_CUESHEET;
Packit 8f7830
	cuesheet->length =
Packit 8f7830
		/* cuesheet guts */
Packit 8f7830
		(
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN
Packit 8f7830
		) / 8 +
Packit 8f7830
		/* 2 tracks */
Packit 8f7830
		3 * (
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN
Packit 8f7830
		) / 8 +
Packit 8f7830
		/* 3 index points */
Packit 8f7830
		3 * (
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN
Packit 8f7830
		) / 8
Packit 8f7830
	;
Packit 8f7830
	memset(cuesheet->data.cue_sheet.media_catalog_number, 0, sizeof(cuesheet->data.cue_sheet.media_catalog_number));
Packit 8f7830
	cuesheet->data.cue_sheet.media_catalog_number[0] = 'j';
Packit 8f7830
	cuesheet->data.cue_sheet.media_catalog_number[1] = 'C';
Packit 8f7830
	cuesheet->data.cue_sheet.lead_in = 2 * 44100;
Packit 8f7830
	cuesheet->data.cue_sheet.is_cd = true;
Packit 8f7830
	cuesheet->data.cue_sheet.num_tracks = 3;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks = calloc_or_die_(cuesheet->data.cue_sheet.num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track));
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].offset = 0;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].number = 1;
Packit 8f7830
	memcpy(cuesheet->data.cue_sheet.tracks[0].isrc, "ACBDE1234567", sizeof(cuesheet->data.cue_sheet.tracks[0].isrc));
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].type = 0;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].pre_emphasis = 1;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].num_indices = 2;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].indices = malloc_or_die_(cuesheet->data.cue_sheet.tracks[0].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].indices[0].offset = 0;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].indices[0].number = 0;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].indices[1].offset = 123 * 588;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[0].indices[1].number = 1;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].offset = 1234 * 588;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].number = 2;
Packit 8f7830
	memcpy(cuesheet->data.cue_sheet.tracks[1].isrc, "ACBDE7654321", sizeof(cuesheet->data.cue_sheet.tracks[1].isrc));
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].type = 1;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].pre_emphasis = 0;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].num_indices = 1;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].indices = malloc_or_die_(cuesheet->data.cue_sheet.tracks[1].num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].indices[0].offset = 0;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[1].indices[0].number = 1;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[2].offset = 12345 * 588;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[2].number = 170;
Packit 8f7830
	cuesheet->data.cue_sheet.tracks[2].num_indices = 0;
Packit 8f7830
Packit 8f7830
	picture->is_last = false;
Packit 8f7830
	picture->type = FLAC__METADATA_TYPE_PICTURE;
Packit 8f7830
	picture->length =
Packit 8f7830
		(
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_TYPE_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* will add the length for the string later */
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* will add the length for the string later */
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_COLORS_LEN +
Packit 8f7830
			FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN /* will add the length for the data later */
Packit 8f7830
		) / 8
Packit 8f7830
	;
Packit 8f7830
	picture->data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER;
Packit 8f7830
	picture->data.picture.mime_type = strdup_or_die_("image/jpeg");
Packit 8f7830
	picture->length += strlen(picture->data.picture.mime_type);
Packit 8f7830
	picture->data.picture.description = (FLAC__byte*)strdup_or_die_("desc");
Packit 8f7830
	picture->length += strlen((const char *)picture->data.picture.description);
Packit 8f7830
	picture->data.picture.width = 300;
Packit 8f7830
	picture->data.picture.height = 300;
Packit 8f7830
	picture->data.picture.depth = 24;
Packit 8f7830
	picture->data.picture.colors = 0;
Packit 8f7830
	picture->data.picture.data = (FLAC__byte*)strdup_or_die_("SOMEJPEGDATA");
Packit 8f7830
	picture->data.picture.data_length = strlen((const char *)picture->data.picture.data);
Packit 8f7830
	picture->length += picture->data.picture.data_length;
Packit 8f7830
Packit 8f7830
	unknown->is_last = true;
Packit 8f7830
	unknown->type = 126;
Packit 8f7830
	unknown->length = 8;
Packit 8f7830
	unknown->data.unknown.data = malloc_or_die_(unknown->length);
Packit 8f7830
	memcpy(unknown->data.unknown.data, "\xfe\xdc\xba\x98\xf0\xe1\xd2\xc3", unknown->length);
Packit 8f7830
}
Packit 8f7830
Packit 8f7830
void mutils__free_metadata_blocks(
Packit 8f7830
	FLAC__StreamMetadata *streaminfo,
Packit 8f7830
	FLAC__StreamMetadata *padding,
Packit 8f7830
	FLAC__StreamMetadata *seektable,
Packit 8f7830
	FLAC__StreamMetadata *application1,
Packit 8f7830
	FLAC__StreamMetadata *application2,
Packit 8f7830
	FLAC__StreamMetadata *vorbiscomment,
Packit 8f7830
	FLAC__StreamMetadata *cuesheet,
Packit 8f7830
	FLAC__StreamMetadata *picture,
Packit 8f7830
	FLAC__StreamMetadata *unknown
Packit 8f7830
)
Packit 8f7830
{
Packit 8f7830
	(void)streaminfo, (void)padding, (void)application2;
Packit 8f7830
	free(seektable->data.seek_table.points);
Packit 8f7830
	free(application1->data.application.data);
Packit 8f7830
	free(vorbiscomment->data.vorbis_comment.vendor_string.entry);
Packit 8f7830
	free(vorbiscomment->data.vorbis_comment.comments[0].entry);
Packit 8f7830
	free(vorbiscomment->data.vorbis_comment.comments);
Packit 8f7830
	free(cuesheet->data.cue_sheet.tracks[0].indices);
Packit 8f7830
	free(cuesheet->data.cue_sheet.tracks[1].indices);
Packit 8f7830
	free(cuesheet->data.cue_sheet.tracks);
Packit 8f7830
	free(picture->data.picture.mime_type);
Packit 8f7830
	free(picture->data.picture.description);
Packit 8f7830
	free(picture->data.picture.data);
Packit 8f7830
	free(unknown->data.unknown.data);
Packit 8f7830
}