3 #include "../exceptions.h"
4 #include "../tagvalue.h"
6 #include <c++utilities/conversion/binaryconversion.h>
7 #include <c++utilities/io/binaryreader.h>
8 #include <c++utilities/io/binarywriter.h>
9 #include <c++utilities/io/bitreader.h>
29 void FlacMetaDataBlockHeader::parseHeader(
const char *buffer)
31 m_last = *buffer & 0x80;
32 m_type = *buffer & (0x80 - 1);
33 m_dataSize = BE::toUInt24(buffer + 1);
40 void FlacMetaDataBlockHeader::makeHeader(std::ostream &outputStream)
43 *buff = (m_last ? (0x80 | m_type) : m_type);
44 BE::getBytes24(m_dataSize, reinterpret_cast<char *>(buff) + 1);
45 outputStream.write(reinterpret_cast<char *>(buff),
sizeof(buff));
58 void FlacMetaDataBlockStreamInfo::parse(
const char *buffer)
60 BitReader reader(buffer, 0x22);
61 m_minBlockSize = reader.readBits<std::uint16_t>(16);
62 m_maxBlockSize = reader.readBits<std::uint16_t>(16);
63 m_minFrameSize = reader.readBits<std::uint32_t>(24);
64 m_maxFrameSize = reader.readBits<std::uint32_t>(24);
65 m_samplingFrequency = reader.readBits<std::uint32_t>(20);
66 m_channelCount = reader.readBits<std::uint8_t>(3) + 1;
67 m_bitsPerSample = reader.readBits<std::uint8_t>(5) + 1;
68 m_totalSampleCount = reader.readBits<std::uint64_t>(36);
69 memcpy(m_md5Sum, buffer + 0x22 -
sizeof(m_md5Sum),
sizeof(m_md5Sum));
83 void FlacMetaDataBlockPicture::parse(istream &inputStream, std::uint32_t maxSize)
86 BinaryReader reader(&inputStream);
87 m_pictureType = reader.readUInt32BE();
88 std::uint32_t size = reader.readUInt32BE();
90 m_value.setMimeType(reader.readString(size));
91 size = reader.readUInt32BE();
93 m_value.setDescription(reader.readString(size));
95 inputStream.seekg(4 * 4, ios_base::cur);
96 size = reader.readUInt32BE();
99 auto data = make_unique<char[]>(size);
100 inputStream.read(data.get(), size);
101 m_value.assignData(move(data), size, TagDataType::Picture);
112 std::uint32_t FlacMetaDataBlockPicture::requiredSize()
const
114 const auto requiredSize(32 + m_value.mimeType().size() + m_value.description().size() + m_value.dataSize());
115 if (requiredSize > numeric_limits<std::uint32_t>::max()) {
118 return static_cast<std::uint32_t>(requiredSize);
125 void FlacMetaDataBlockPicture::make(ostream &outputStream)
127 if (m_value.mimeType().size() > numeric_limits<std::uint32_t>::max() || m_value.description().size() > numeric_limits<std::uint32_t>::max()
128 || m_value.dataSize() > numeric_limits<std::uint32_t>::max()) {
131 BinaryWriter writer(&outputStream);
132 writer.writeUInt32BE(pictureType());
133 writer.writeUInt32BE(static_cast<std::uint32_t>(m_value.mimeType().size()));
134 writer.writeString(m_value.mimeType());
135 writer.writeUInt32BE(static_cast<std::uint32_t>(m_value.description().size()));
136 writer.writeString(m_value.description());
137 writer.writeUInt32BE(0);
138 writer.writeUInt32BE(0);
139 writer.writeUInt32BE(0);
140 writer.writeUInt32BE(0);
141 writer.writeUInt32BE(static_cast<std::uint32_t>(m_value.dataSize()));
142 writer.write(value().dataPointer(), static_cast<streamoff>(m_value.dataSize()));