📄 metadata_manip.cpp
字号:
if(0 == (padding = new FLAC::Metadata::Padding())) return die_("new FLAC::Metadata::Padding()"); padding->set_length(20); FLAC::Metadata::SimpleIterator iterator; if(!iterator.is_valid()) return die_("iterator.is_valid() returned false"); if(!iterator.init(flacfile_, /*read_only=*/false, /*preserve_file_stats=*/false)) return die_("iterator.init() returned false"); our_current_position = 0; printf("is writable = %u\n", (unsigned)iterator.is_writable()); printf("[S]VP\ttry to write over STREAMINFO block...\n"); if(!iterator.set_block(app, false)) printf("\titerator.set_block() returned false like it should\n"); else return die_("iterator.set_block() returned true but shouldn't have"); printf("[S]VP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("S[V]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[P]\tinsert PADDING after, don't expand into padding\n"); padding->set_length(25); if(!iterator.insert_block_after(padding, false)) return die_ss_("iterator.insert_block_after(padding, false)", iterator); if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; printf("SVP[P]\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("SV[P]P\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("S[V]PP\tinsert PADDING after, don't expand into padding\n"); padding->set_length(30); if(!iterator.insert_block_after(padding, false)) return die_ss_("iterator.insert_block_after(padding, false)", iterator); if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[P]PP\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("S[V]PPP\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("[S]VPPP\tdelete (STREAMINFO block), must fail\n"); if(iterator.delete_block(false)) return die_ss_("iterator.delete_block(false) should have returned false", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("[S]VPPP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("S[V]PPP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[P]PP\tdelete (middle block), replace with padding\n"); if(!iterator.delete_block(true)) return die_ss_("iterator.delete_block(true)", iterator); our_current_position--; printf("S[V]PPP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[P]PP\tdelete (middle block), don't replace with padding\n"); if(!iterator.delete_block(false)) return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("S[V]PP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SV[P]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVP[P]\tdelete (last block), replace with padding\n"); if(!iterator.delete_block(true)) return die_ss_("iterator.delete_block(false)", iterator); our_current_position--; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[P]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVP[P]\tdelete (last block), don't replace with padding\n"); if(!iterator.delete_block(false)) return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[P]\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("S[V]P\tprev\n"); if(!iterator.prev()) 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 = iterator.get_block(); streaminfo = dynamic_cast<FLAC::Metadata::StreamInfo *>(block); FLAC__ASSERT(0 != streaminfo); streaminfo->set_sample_rate(32000); if(!replace_in_our_metadata_(block, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(block, false)) return die_ss_("iterator.set_block(block, false)", iterator); delete block; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("[S]VP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("S[V]P\tinsert APPLICATION after, expand into padding of exceeding size\n"); app->set_id((const unsigned char *)"euh"); /* twiddle the id so that our comparison doesn't miss transposition */ if(!iterator.insert_block_after(app, true)) return die_ss_("iterator.insert_block_after(app, true)", iterator); if(!insert_to_our_metadata_(app, ++our_current_position, /*copy=*/true)) return false; add_to_padding_length_(our_current_position+1, -((int)(FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + (int)app->get_length())); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVA[P]\tset APPLICATION, expand into padding of exceeding size\n"); app->set_id((const unsigned char *)"fuh"); /* twiddle the id */ if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!insert_to_our_metadata_(app, our_current_position, /*copy=*/true)) return false; add_to_padding_length_(our_current_position+1, -((int)(FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) + (int)app->get_length())); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (grow), don't expand into padding\n"); app->set_id((const unsigned char *)"guh"); /* twiddle the id */ if(!app->set_data(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(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (shrink), don't fill in with padding\n"); app->set_id((const unsigned char *)"huh"); /* twiddle the id */ if(!app->set_data(data, 12, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (grow), expand into padding of exceeding size\n"); app->set_id((const unsigned char *)"iuh"); /* twiddle the id */ if(!app->set_data(data, sizeof(data), true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); add_to_padding_length_(our_current_position+1, -((int)sizeof(data) - 12)); if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tset APPLICATION (shrink), fill in with padding\n"); app->set_id((const unsigned char *)"juh"); /* twiddle the id */ if(!app->set_data(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"); dynamic_cast<FLAC::Metadata::Padding *>(our_metadata_.blocks[our_current_position+1])->set_length(sizeof(data) - 23 - FLAC__STREAM_METADATA_HEADER_LENGTH); if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVA[A]PP\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVAA[P]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVAAP[P]\tset PADDING (shrink), don't fill in with padding\n"); padding->set_length(5); if(!replace_in_our_metadata_(padding, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(padding, false)) return die_ss_("iterator.set_block(padding, false)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVAAP[P]\tset APPLICATION (grow)\n"); app->set_id((const unsigned char *)"kuh"); /* twiddle the id */ if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(app, false)) return die_ss_("iterator.set_block(app, false)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVAAP[A]\tset PADDING (equal)\n"); padding->set_length(27); if(!replace_in_our_metadata_(padding, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(padding, false)) return die_ss_("iterator.set_block(padding, false)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVAAP[P]\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("SVAA[P]P\tdelete (middle block), don't replace with padding\n"); if(!iterator.delete_block(false)) return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVA[A]P\tdelete (middle block), don't replace with padding\n"); if(!iterator.delete_block(false)) return die_ss_("iterator.delete_block(false)", iterator); delete_from_our_metadata_(our_current_position--); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tnext\n"); if(!iterator.next()) return die_("iterator ended early\n"); our_current_position++; printf("SVA[P]\tinsert PADDING after\n"); padding->set_length(5); if(!iterator.insert_block_after(padding, false)) return die_ss_("iterator.insert_block_after(padding, false)", iterator); if(!insert_to_our_metadata_(padding, ++our_current_position, /*copy=*/true)) return false; if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SVAP[P]\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("SVA[P]P\tprev\n"); if(!iterator.prev()) return die_("iterator ended early\n"); our_current_position--; printf("SV[A]PP\tset APPLICATION (grow), try to expand into padding which is too small\n"); if(!app->set_data(data, 32, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), try to expand into padding which is 'close' but still too small\n"); if(!app->set_data(data, 60, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), expand into padding which will leave 0-length pad\n"); if(!app->set_data(data, 87, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); dynamic_cast<FLAC::Metadata::Padding *>(our_metadata_.blocks[our_current_position+1])->set_length(0); if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]PP\tset APPLICATION (grow), expand into padding which is exactly consumed\n"); if(!app->set_data(data, 91, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); delete_from_our_metadata_(our_current_position+1); if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]P\tset APPLICATION (grow), expand into padding which is exactly consumed\n"); if(!app->set_data(data, 100, true)) return die_("setting APPLICATION data"); if(!replace_in_our_metadata_(app, our_current_position, /*copy=*/true)) return die_("copying object"); delete_from_our_metadata_(our_current_position+1); our_metadata_.blocks[our_current_position]->set_is_last(true); if(!iterator.set_block(app, true)) return die_ss_("iterator.set_block(app, true)", iterator); if(!test_file_(flacfile_, /*ignore_metadata=*/false)) return false; printf("SV[A]\tset PADDING (equal size)\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -