winamp/Src/nsavi/info.cpp

68 lines
1.1 KiB
C++
Raw Permalink Normal View History

2024-09-24 13:54:57 +01:00
#include "info.h"
#include "read.h"
nsavi::Info::Info()
{
}
nsavi::Info::~Info()
{
for (auto itr = this->begin(); itr != this->end(); itr++)
{
free((void*)itr->second);
}
}
int nsavi::Info::Read(nsavi::avi_reader* reader, uint32_t data_len)
{
while (data_len)
{
riff_chunk chunk;
uint32_t bytes_read = 0;
nsavi::read_riff_chunk(reader, &chunk, &bytes_read);
data_len -= bytes_read;
size_t malloc_size = chunk.size + 1;
if (malloc_size == 0)
return READ_INVALID_DATA;
char* str = (char*)calloc(malloc_size, sizeof(char));
if (!str)
return READ_OUT_OF_MEMORY;
reader->Read(str, chunk.size, &bytes_read);
str[chunk.size] = 0;
data_len -= bytes_read;
Set(chunk.id, str);
if (chunk.size & 1)
{
reader->Skip(1);
data_len--;
}
}
return 0;
}
void nsavi::Info::Set(uint32_t chunk_id, const char* data)
{
auto it = this->find(chunk_id);
if (this->end() == it)
{
this->insert({ chunk_id, data });
}
else
{
it->second = data;
}
}
const char* nsavi::Info::GetMetadata(uint32_t id)
{
InfoMap::iterator itr = InfoMap::find(id);
if (itr != InfoMap::end())
{
return itr->second;
}
return 0;
}