📄 metadata_manip.c
字号:
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); if(!test_file_(flacfile_, decoder_metadata_callback_compare_)) return false; printf("SVA[A]P\tset APPLICATION (shrink), fill in with padding\n"); app->data.application.id[0] = 'j'; /* twiddle the id */ if(!FLAC__metadata_object_application_set_data(app, data, 23, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); if(!insert_to_our_metadata_(padding, our_current_position+1, /*copy=*/true)) return die_("copying object"); our_metadata_.blocks[our_current_position+1]->length = sizeof(data) - 23 - FLAC__STREAM_METADATA_HEADER_LENGTH; if(!FLAC__metadata_simple_iterator_set_block(iterator, app, true)) return die_ss_("FLAC__metadata_simple_iterator_set_block(iterator, app, true)", iterator); if(!test_file_(flacfile_, decoder_metadata_callback_compare_)) return false; printf("SVA[A]PP\tnext\n"); if(!FLAC__metadata_simple_iterator_next(iterator))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -