⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metadata_manip.c

📁 这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔者对其中的LIBMAD库做了针对ARM MPU的优化. 并增加了词幕功能.
💻 C
📖 第 1 页 / 共 5 页
字号:

	/* initialize 'data' to avoid Valgrind errors */
	memset(data, 0, sizeof(data));

	printf("\n\n++++++ testing level 1 interface\n");

	/************************************************************/

	printf("simple iterator on read-only file\n");

	if(!generate_file_())
		return false;

	if(!change_stats_(flacfile_, /*read_only=*/true))
		return false;

	if(!test_file_(flacfile_, decoder_metadata_callback_null_))
		return false;

	if(0 == (iterator = FLAC__metadata_simple_iterator_new()))
		return die_("FLAC__metadata_simple_iterator_new()");

	if(!FLAC__metadata_simple_iterator_init(iterator, flacfile_, /*read_only=*/false, /*preserve_file_stats=*/false))
		return die_("FLAC__metadata_simple_iterator_init() returned false");

	printf("is writable = %u\n", (unsigned)FLAC__metadata_simple_iterator_is_writable(iterator));
	if(FLAC__metadata_simple_iterator_is_writable(iterator))
		return die_("iterator claims file is writable when tester thinks it should not be; are you running as root?\n");

	printf("iterate forwards\n");

	if(FLAC__metadata_simple_iterator_get_block_type(iterator) != FLAC__METADATA_TYPE_STREAMINFO)
		return die_("expected STREAMINFO type from FLAC__metadata_simple_iterator_get_block_type()");
	if(0 == (block = FLAC__metadata_simple_iterator_get_block(iterator)))
		return die_("getting block 0");
	if(block->type != FLAC__METADATA_TYPE_STREAMINFO)
		return die_("expected STREAMINFO type");
	if(block->is_last)
		return die_("expected is_last to be false");
	if(block->length != FLAC__STREAM_METADATA_STREAMINFO_LENGTH)
		return die_("bad STREAMINFO length");
	/* check to see if some basic data matches (c.f. generate_file_()) */
	if(block->data.stream_info.channels != 1)
		return die_("mismatch in channels");
	if(block->data.stream_info.bits_per_sample != 8)
		return die_("mismatch in bits_per_sample");
	if(block->data.stream_info.sample_rate != 44100)
		return die_("mismatch in sample_rate");
	if(block->data.stream_info.min_blocksize != 576)
		return die_("mismatch in min_blocksize");
	if(block->data.stream_info.max_blocksize != 576)
		return die_("mismatch in max_blocksize");
	FLAC__metadata_object_delete(block);

	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("forward iterator ended early");
	our_current_position++;

	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("forward iterator ended early");
	our_current_position++;

	if(FLAC__metadata_simple_iterator_get_block_type(iterator) != FLAC__METADATA_TYPE_PADDING)
		return die_("expected PADDING type from FLAC__metadata_simple_iterator_get_block_type()");
	if(0 == (block = FLAC__metadata_simple_iterator_get_block(iterator)))
		return die_("getting block 2");
	if(block->type != FLAC__METADATA_TYPE_PADDING)
		return die_("expected PADDING type");
	if(!block->is_last)
		return die_("expected is_last to be true");
	/* check to see if some basic data matches (c.f. generate_file_()) */
	if(block->length != 1234)
		return die_("bad PADDING length");
	FLAC__metadata_object_delete(block);

	if(FLAC__metadata_simple_iterator_next(iterator))
		return die_("forward iterator returned true but should have returned false");

	printf("iterate backwards\n");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("reverse iterator ended early");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("reverse iterator ended early");
	if(FLAC__metadata_simple_iterator_prev(iterator))
		return die_("reverse iterator returned true but should have returned false");

	printf("testing FLAC__metadata_simple_iterator_set_block() on read-only file...\n");

	if(!FLAC__metadata_simple_iterator_set_block(iterator, (FLAC__StreamMetadata*)99, false))
		printf("OK: FLAC__metadata_simple_iterator_set_block() returned false like it should\n");
	else
		return die_("FLAC__metadata_simple_iterator_set_block() returned true but shouldn't have");

	FLAC__metadata_simple_iterator_delete(iterator);

	/************************************************************/

	printf("simple iterator on writable file\n");

	if(!change_stats_(flacfile_, /*read-only=*/false))
		return false;

	printf("creating APPLICATION block\n");

	if(0 == (app = FLAC__metadata_object_new(FLAC__METADATA_TYPE_APPLICATION)))
		return die_("FLAC__metadata_object_new(FLAC__METADATA_TYPE_APPLICATION)");
	memcpy(app->data.application.id, "duh", (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8));

	printf("creating PADDING block\n");

	if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING)))
		return die_("FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING)");
	padding->length = 20;

	if(0 == (iterator = FLAC__metadata_simple_iterator_new()))
		return die_("FLAC__metadata_simple_iterator_new()");

	if(!FLAC__metadata_simple_iterator_init(iterator, flacfile_, /*read_only=*/false, /*preserve_file_stats=*/false))
		return die_("FLAC__metadata_simple_iterator_init() returned false");
	our_current_position = 0;

	printf("is writable = %u\n", (unsigned)FLAC__metadata_simple_iterator_is_writable(iterator));

	printf("[S]VP\ttry to write over STREAMINFO block...\n");
	if(!FLAC__metadata_simple_iterator_set_block(iterator, app, false))
		printf("\tFLAC__metadata_simple_iterator_set_block() returned false like it should\n");
	else
		return die_("FLAC__metadata_simple_iterator_set_block() returned true but shouldn't have");

	printf("[S]VP\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("S[V]P\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("SV[P]\tinsert PADDING after, don't expand into padding\n");
	padding->length = 25;
	if(!FLAC__metadata_simple_iterator_insert_block_after(iterator, padding, false))
		return die_ss_("FLAC__metadata_simple_iterator_insert_block_after(iterator, padding, false)", iterator);
	if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true))
		return false;

	printf("SVP[P]\tprev\n");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("iterator ended early\n");
	our_current_position--;

	printf("SV[P]P\tprev\n");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("iterator ended early\n");
	our_current_position--;

	printf("S[V]PP\tinsert PADDING after, don't expand into padding\n");
	padding->length = 30;
	if(!FLAC__metadata_simple_iterator_insert_block_after(iterator, padding, false))
		return die_ss_("FLAC__metadata_simple_iterator_insert_block_after(iterator, padding, false)", iterator);
	if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true))
		return false;

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("SV[P]PP\tprev\n");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("iterator ended early\n");
	our_current_position--;

	printf("S[V]PPP\tprev\n");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("iterator ended early\n");
	our_current_position--;

	printf("[S]VPPP\tdelete (STREAMINFO block), must fail\n");
	if(FLAC__metadata_simple_iterator_delete_block(iterator, false))
		return die_ss_("FLAC__metadata_simple_iterator_delete_block(iterator, false) should have returned false", iterator);

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("[S]VPPP\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("S[V]PPP\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("SV[P]PP\tdelete (middle block), replace with padding\n");
	if(!FLAC__metadata_simple_iterator_delete_block(iterator, true))
		return die_ss_("FLAC__metadata_simple_iterator_delete_block(iterator, true)", iterator);
	our_current_position--;

	printf("S[V]PPP\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("SV[P]PP\tdelete (middle block), don't replace with padding\n");
	if(!FLAC__metadata_simple_iterator_delete_block(iterator, false))
		return die_ss_("FLAC__metadata_simple_iterator_delete_block(iterator, false)", iterator);
	delete_from_our_metadata_(our_current_position--);

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("S[V]PP\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("SV[P]P\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("SVP[P]\tdelete (last block), replace with padding\n");
	if(!FLAC__metadata_simple_iterator_delete_block(iterator, true))
		return die_ss_("FLAC__metadata_simple_iterator_delete_block(iterator, false)", iterator);
	our_current_position--;

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("SV[P]P\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("SVP[P]\tdelete (last block), don't replace with padding\n");
	if(!FLAC__metadata_simple_iterator_delete_block(iterator, false))
		return die_ss_("FLAC__metadata_simple_iterator_delete_block(iterator, false)", iterator);
	delete_from_our_metadata_(our_current_position--);

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("SV[P]\tprev\n");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("iterator ended early\n");
	our_current_position--;

	printf("S[V]P\tprev\n");
	if(!FLAC__metadata_simple_iterator_prev(iterator))
		return die_("iterator ended early\n");
	our_current_position--;

	printf("[S]VP\tset STREAMINFO (change sample rate)\n");
	FLAC__ASSERT(our_current_position == 0);
	block = FLAC__metadata_simple_iterator_get_block(iterator);
	block->data.stream_info.sample_rate = 32000;
	if(!replace_in_our_metadata_(block, our_current_position, /*copy=*/true))
		return die_("copying object");
	if(!FLAC__metadata_simple_iterator_set_block(iterator, block, false))
		return die_ss_("FLAC__metadata_simple_iterator_set_block(iterator, block, false)", iterator);
	FLAC__metadata_object_delete(block);

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("[S]VP\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("S[V]P\tinsert APPLICATION after, expand into padding of exceeding size\n");
	app->data.application.id[0] = 'e'; /* twiddle the id so that our comparison doesn't miss transposition */
	if(!FLAC__metadata_simple_iterator_insert_block_after(iterator, app, true))
		return die_ss_("FLAC__metadata_simple_iterator_insert_block_after(iterator, app, true)", iterator);
	if(!insert_to_our_metadata_(app, ++our_current_position, /*copy=*/true))
		return false;
	our_metadata_.blocks[our_current_position+1]->length -= (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + app->length;

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("SV[A]P\tnext\n");
	if(!FLAC__metadata_simple_iterator_next(iterator))
		return die_("iterator ended early\n");
	our_current_position++;

	printf("SVA[P]\tset APPLICATION, expand into padding of exceeding size\n");
	app->data.application.id[0] = 'f'; /* twiddle the id */
	if(!FLAC__metadata_simple_iterator_set_block(iterator, app, true))
		return die_ss_("FLAC__metadata_simple_iterator_set_block(iterator, app, true)", iterator);
	if(!insert_to_our_metadata_(app, our_current_position, /*copy=*/true))
		return false;
	our_metadata_.blocks[our_current_position+1]->length -= (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + app->length;

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("SVA[A]P\tset APPLICATION (grow), don't expand into padding\n");
	app->data.application.id[0] = 'g'; /* twiddle the id */
	if(!FLAC__metadata_object_application_set_data(app, data, sizeof(data), true))
		return die_("setting APPLICATION data");
	if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true))
		return die_("copying object");
	if(!FLAC__metadata_simple_iterator_set_block(iterator, app, false))
		return die_ss_("FLAC__metadata_simple_iterator_set_block(iterator, app, false)", iterator);

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("SVA[A]P\tset APPLICATION (shrink), don't fill in with padding\n");
	app->data.application.id[0] = 'h'; /* twiddle the id */
	if(!FLAC__metadata_object_application_set_data(app, data, 12, true))
		return die_("setting APPLICATION data");
	if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true))
		return die_("copying object");
	if(!FLAC__metadata_simple_iterator_set_block(iterator, app, false))
		return die_ss_("FLAC__metadata_simple_iterator_set_block(iterator, app, false)", iterator);

	if(!test_file_(flacfile_, decoder_metadata_callback_compare_))
		return false;

	printf("SVA[A]P\tset APPLICATION (grow), expand into padding of exceeding size\n");
	app->data.application.id[0] = 'i'; /* twiddle the id */
	if(!FLAC__metadata_object_application_set_data(app, data, sizeof(data), true))
		return die_("setting APPLICATION data");
	if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true))
		return die_("copying object");
	our_metadata_.blocks[our_current_position+1]->length -= (sizeof(data) - 12);
	if(!FLAC__metadata_simple_iterator_set_block(iterator, app, true))
		return die_ss_("FLAC__metadata_simple_iterator_set_block(iterator, app, true)", iterator);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -