static long write_metadata_block_packets(FILE *out, const int serial, const char *vendor, const size_t num_tags, char **tags, size_t padding, ogg_packet **metadata) { const size_t header_length = vc_size(vendor, num_tags, tags); if (header_length > (2<<24)) return OGGEDIT_ALLOCATION_FAILURE; char magic[4]; magic[0] = VCTYPE; magic[1] = header_length >> 16 & 0xFF; magic[2] = header_length >> 8 & 0xFF; magic[3] = header_length & 0xFF; ogg_packet_clear(metadata[0]); if (!fill_vc_packet(magic, 4, vendor, num_tags, tags, false, padding, metadata[0])) return OGGEDIT_ALLOCATION_FAILURE; ogg_stream_state os; if (ogg_stream_init(&os, serial)) return OGGEDIT_FAILED_TO_INIT_STREAM; os.b_o_s = 1; os.pageno = 1; for (int i = 0; metadata[i]; i++) { if (!metadata[i+1]) metadata[i]->packet[0] |= LASTBLOCK; ogg_stream_packetin(&os, metadata[i]); } return flush_stream(out, &os); }
static int64_t write_opus_tags(FILE *out, const int64_t serial, const char *vendor, const uint32_t num_tags, char **tags, const size_t padding) { ogg_packet op; if (!fill_vc_packet(TAGMAGIC, strlen(TAGMAGIC), vendor, num_tags, tags, false, padding, &op)) return OGGEDIT_ALLOCATION_FAILURE; ogg_stream_state os; if (ogg_stream_init(&os, (int)serial)) return OGGEDIT_FAILED_TO_INIT_STREAM; os.b_o_s = 1; os.pageno = 1; ogg_stream_packetin(&os, &op); ogg_packet_clear(&op); return flush_stream(out, &os); }