metadata_object.c
来自「这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔」· C语言 代码 · 共 1,835 行 · 第 1/5 页
C
1,835 行
tr->indices[pos] = index;
cs_calc_len_(block);
}
static void tr_insert_new_(FLAC__StreamMetadata *block, unsigned track_num, unsigned pos, FLAC__StreamMetadata_CueSheet_Index index)
{
FLAC__StreamMetadata_CueSheet_Track *tr;
FLAC__ASSERT(track_num < block->data.cue_sheet.num_tracks);
tr = &block->data.cue_sheet.tracks[track_num];
FLAC__ASSERT(pos <= tr->num_indices);
tr_resize_(block, track_num, tr->num_indices+1);
memmove(&tr->indices[pos+1], &tr->indices[pos], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(tr->num_indices-1-pos));
tr_set_new_(block, track_num, pos, index);
cs_calc_len_(block);
}
static void tr_delete_(FLAC__StreamMetadata *block, unsigned track_num, unsigned pos)
{
FLAC__StreamMetadata_CueSheet_Track *tr;
FLAC__ASSERT(track_num < block->data.cue_sheet.num_tracks);
tr = &block->data.cue_sheet.tracks[track_num];
FLAC__ASSERT(pos <= tr->num_indices);
memmove(&tr->indices[pos], &tr->indices[pos+1], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(tr->num_indices-pos-1));
tr_resize_(block, track_num, tr->num_indices-1);
cs_calc_len_(block);
}
static void cs_resize_(FLAC__StreamMetadata *block, unsigned num)
{
FLAC__StreamMetadata_CueSheet *cs = &block->data.cue_sheet;
if(cs->num_tracks != 0) {
FLAC__ASSERT(0 != cs->tracks);
if(num < cs->num_tracks) {
unsigned i;
for(i = num; i < cs->num_tracks; i++) {
if(0 != cs->tracks[i].indices)
free(cs->tracks[i].indices);
}
}
}
if(num == 0) {
if(0 != cs->tracks) {
free(cs->tracks);
cs->tracks = 0;
}
}
else {
cs->tracks = (FLAC__StreamMetadata_CueSheet_Track*)realloc(cs->tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)*num);
FLAC__ASSERT(0 != cs->tracks);
if(num > cs->num_tracks)
memset(cs->tracks+cs->num_tracks, 0, sizeof(FLAC__StreamMetadata_CueSheet_Track)*(num-cs->num_tracks));
}
cs->num_tracks = num;
cs_calc_len_(block);
}
static void cs_set_new_(FLAC__StreamMetadata_CueSheet_Track *track, FLAC__StreamMetadata *block, unsigned pos, FLAC__uint64 offset, FLAC__byte number, const char *isrc, FLAC__bool data, FLAC__bool pre_em)
{
track_new_(track, offset, number, isrc, data, pre_em);
block->data.cue_sheet.tracks[pos] = *track;
cs_calc_len_(block);
}
static void cs_insert_new_(FLAC__StreamMetadata_CueSheet_Track *track, FLAC__StreamMetadata *block, unsigned pos, FLAC__uint64 offset, FLAC__byte number, const char *isrc, FLAC__bool data, FLAC__bool pre_em)
{
cs_resize_(block, block->data.cue_sheet.num_tracks+1);
memmove(&block->data.cue_sheet.tracks[pos+1], &block->data.cue_sheet.tracks[pos], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(block->data.cue_sheet.num_tracks-1-pos));
cs_set_new_(track, block, pos, offset, number, isrc, data, pre_em);
cs_calc_len_(block);
}
static void cs_delete_(FLAC__StreamMetadata *block, unsigned pos)
{
if(0 != block->data.cue_sheet.tracks[pos].indices)
free(block->data.cue_sheet.tracks[pos].indices);
memmove(&block->data.cue_sheet.tracks[pos], &block->data.cue_sheet.tracks[pos+1], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(block->data.cue_sheet.num_tracks-pos-1));
block->data.cue_sheet.tracks[block->data.cue_sheet.num_tracks-1].indices = 0;
block->data.cue_sheet.tracks[block->data.cue_sheet.num_tracks-1].num_indices = 0;
cs_resize_(block, block->data.cue_sheet.num_tracks-1);
cs_calc_len_(block);
}
FLAC__bool test_metadata_object()
{
FLAC__StreamMetadata *block, *blockcopy, *vorbiscomment, *cuesheet;
FLAC__StreamMetadata_SeekPoint seekpoint_array[8];
FLAC__StreamMetadata_VorbisComment_Entry entry;
FLAC__StreamMetadata_CueSheet_Index index;
FLAC__StreamMetadata_CueSheet_Track track;
unsigned i, expected_length, seekpoints;
int j;
static FLAC__byte dummydata[4] = { 'a', 'b', 'c', 'd' };
printf("\n+++ libFLAC unit test: metadata objects\n\n");
printf("testing STREAMINFO\n");
printf("testing FLAC__metadata_object_new()... ");
block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_STREAMINFO);
if(0 == block) {
printf("FAILED, returned NULL\n");
return false;
}
expected_length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
if(block->length != expected_length) {
printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length);
return false;
}
printf("OK\n");
printf("testing FLAC__metadata_object_clone()... ");
blockcopy = FLAC__metadata_object_clone(block);
if(0 == blockcopy) {
printf("FAILED, returned NULL\n");
return false;
}
if(!mutils__compare_block(block, blockcopy))
return false;
printf("OK\n");
printf("testing FLAC__metadata_object_delete()... ");
FLAC__metadata_object_delete(blockcopy);
FLAC__metadata_object_delete(block);
printf("OK\n");
printf("testing PADDING\n");
printf("testing FLAC__metadata_object_new()... ");
block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
if(0 == block) {
printf("FAILED, returned NULL\n");
return false;
}
expected_length = 0;
if(block->length != expected_length) {
printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length);
return false;
}
printf("OK\n");
printf("testing FLAC__metadata_object_clone()... ");
blockcopy = FLAC__metadata_object_clone(block);
if(0 == blockcopy) {
printf("FAILED, returned NULL\n");
return false;
}
if(!mutils__compare_block(block, blockcopy))
return false;
printf("OK\n");
printf("testing FLAC__metadata_object_delete()... ");
FLAC__metadata_object_delete(blockcopy);
FLAC__metadata_object_delete(block);
printf("OK\n");
printf("testing APPLICATION\n");
printf("testing FLAC__metadata_object_new()... ");
block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_APPLICATION);
if(0 == block) {
printf("FAILED, returned NULL\n");
return false;
}
expected_length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8;
if(block->length != expected_length) {
printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length);
return false;
}
printf("OK\n");
printf("testing FLAC__metadata_object_clone()... ");
blockcopy = FLAC__metadata_object_clone(block);
if(0 == blockcopy) {
printf("FAILED, returned NULL\n");
return false;
}
if(!mutils__compare_block(block, blockcopy))
return false;
printf("OK\n");
printf("testing FLAC__metadata_object_delete()... ");
FLAC__metadata_object_delete(blockcopy);
printf("OK\n");
printf("testing FLAC__metadata_object_application_set_data(copy)... ");
if(!FLAC__metadata_object_application_set_data(block, dummydata, sizeof(dummydata), true/*copy*/)) {
printf("FAILED, returned false\n");
return false;
}
expected_length = (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) + sizeof(dummydata);
if(block->length != expected_length) {
printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length);
return false;
}
if(0 != memcmp(block->data.application.data, dummydata, sizeof(dummydata))) {
printf("FAILED, data mismatch\n");
return false;
}
printf("OK\n");
printf("testing FLAC__metadata_object_clone()... ");
blockcopy = FLAC__metadata_object_clone(block);
if(0 == blockcopy) {
printf("FAILED, returned NULL\n");
return false;
}
if(!mutils__compare_block(block, blockcopy))
return false;
printf("OK\n");
printf("testing FLAC__metadata_object_delete()... ");
FLAC__metadata_object_delete(blockcopy);
printf("OK\n");
printf("testing FLAC__metadata_object_application_set_data(own)... ");
if(!FLAC__metadata_object_application_set_data(block, make_dummydata_(dummydata, sizeof(dummydata)), sizeof(dummydata), false/*own*/)) {
printf("FAILED, returned false\n");
return false;
}
expected_length = (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) + sizeof(dummydata);
if(block->length != expected_length) {
printf("FAILED, bad length, expected %u, got %u\n", expected_length, block->length);
return false;
}
if(0 != memcmp(block->data.application.data, dummydata, sizeof(dummydata))) {
printf("FAILED, data mismatch\n");
return false;
}
printf("OK\n");
printf("testing FLAC__metadata_object_clone()... ");
blockcopy = FLAC__metadata_object_clone(block);
if(0 == blockcopy) {
printf("FAILED, returned NULL\n");
return false;
}
if(!mutils__compare_block(block, blockcopy))
return false;
printf("OK\n");
printf("testing FLAC__metadata_object_delete()... ");
FLAC__metadata_object_delete(blockcopy);
FLAC__metadata_object_delete(block);
printf("OK\n");
printf("testing SEEKTABLE\n");
for(i = 0; i < sizeof(seekpoint_array) / sizeof(FLAC__StreamMetadata_SeekPoint); i++) {
seekpoint_array[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
seekpoint_array[i].stream_offset = 0;
seekpoint_array[i].frame_samples = 0;
}
seekpoints = 0;
printf("testing FLAC__metadata_object_new()... ");
block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE);
if(0 == block) {
printf("FAILED, returned NULL\n");
return false;
}
if(!check_seektable_(block, seekpoints, 0))
return false;
printf("testing FLAC__metadata_object_clone()... ");
blockcopy = FLAC__metadata_object_clone(block);
if(0 == blockcopy) {
printf("FAILED, returned NULL\n");
return false;
}
if(!mutils__compare_block(block, blockcopy))
return false;
printf("OK\n");
printf("testing FLAC__metadata_object_delete()... ");
FLAC__metadata_object_delete(blockcopy);
printf("OK\n");
seekpoints = 2;
printf("testing FLAC__metadata_object_seektable_resize_points(grow to %u)...", seekpoints);
if(!FLAC__metadata_object_seektable_resize_points(block, seekpoints)) {
printf("FAILED, returned false\n");
return false;
}
if(!check_seektable_(block, seekpoints, seekpoint_array))
return false;
seekpoints = 1;
printf("testing FLAC__metadata_object_seektable_resize_points(shrink to %u)...", seekpoints);
if(!FLAC__metadata_object_seektable_resize_points(block, seekpoints)) {
printf("FAILED, returned false\n");
return false;
}
if(!check_seektable_(block, seekpoints, seekpoint_array))
return false;
printf("testing FLAC__metadata_object_seektable_is_legal()...");
if(!FLAC__metadata_object_seektable_is_legal(block)) {
printf("FAILED, returned false\n");
return false;
}
printf("OK\n");
seekpoints = 0;
printf("testing FLAC__metadata_object_seektable_resize_points(shrink to %u)...", seekpoints);
if(!FLAC__metadata_object_seektable_resize_points(block, seekpoints)) {
printf("FAILED, returned false\n");
return false;
}
if(!check_seektable_(block, seekpoints, 0))
return false;
seekpoints++;
printf("testing FLAC__metadata_object_seektable_insert_point() on empty array...");
if(!FLAC__metadata_object_seektable_insert_point(block, 0, seekpoint_array[0])) {
printf("FAILED, returned false\n");
return false;
}
if(!check_seektable_(block, seekpoints, seekpoint_array))
return false;
seekpoint_array[0].sample_number = 1;
seekpoints++;
printf("testing FLAC__metadata_object_seektable_insert_point() on beginning of non-empty array...");
if(!FLAC__metadata_object_seektable_insert_point(block, 0, seekpoint_array[0])) {
printf("FAILED, returned false\n");
return false;
}
if(!check_seektable_(block, seekpoints, seekpoint_array))
return false;
seekpoint_array[1].sample_number = 2;
seekpoints++;
printf("testing FLAC__metadata_object_seektable_insert_point() on middle of non-empty array...");
if(!FLAC__metadata_object_seektable_insert_point(block, 1, seekpoint_array[1])) {
printf("FAILED, returned false\n");
return false;
}
if(!check_seektable_(block, seekpoints, seekpoint_array))
return false;
seekpoint_array[3].sample_number = 3;
seekpoints++;
printf("testing FLAC__metadata_object_seektable_insert_point() on end of non-empty array...");
if(!FLAC__metadata_object_seektable_insert_point(block, 3, seekpoint_array[3])) {
printf("FAILED, returned false\n");
return false;
}
if(!check_seektable_(block, seekpoints, seekpoint_array))
return false;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?