Skip to content

Commit

Permalink
Merge pull request #19 from stream-labs/memory_leak_fix
Browse files Browse the repository at this point in the history
Memory leak fix
  • Loading branch information
eddyStreamlabs authored Aug 17, 2018
2 parents de71f13 + eb319f0 commit e479da3
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 16 deletions.
16 changes: 15 additions & 1 deletion mask-resource-animation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,16 +121,20 @@ Mask::Resource::Animation::Animation(Mask::MaskData* parent, std::string name, o
obs_data_t* chand = obs_data_item_get_obj(el);
if (!chand)
continue;

AnimationChannel channel;

if (!obs_data_has_user_value(chand, S_NAME)) {
obs_data_release(chand);
obs_data_release(channels);
PLOG_ERROR("Animation '%s' channel has no name.", name.c_str());
throw std::logic_error("Animation channel has no name.");
}
std::string itemName = obs_data_get_string(chand, S_NAME);

if (!obs_data_has_user_value(chand, S_TYPE)) {
obs_data_release(chand);
obs_data_release(channels);
PLOG_ERROR("Animation '%s' channel has no type.", name.c_str());
throw std::logic_error("Animation channel has no type.");
}
Expand All @@ -148,23 +152,31 @@ Mask::Resource::Animation::Animation(Mask::MaskData* parent, std::string name, o
}

if (!obs_data_has_user_value(chand, S_PRESTATE)) {
obs_data_release(chand);
obs_data_release(channels);
PLOG_ERROR("Animation '%s' channel has no pre state.", name.c_str());
throw std::logic_error("Animation channel has no pre state.");
}
channel.preState = AnimationBehaviourFromString(obs_data_get_string(chand, S_PRESTATE));

if (!obs_data_has_user_value(chand, S_POSTSTATE)) {
obs_data_release(chand);
obs_data_release(channels);
PLOG_ERROR("Animation '%s' channel has no pose state.", name.c_str());
throw std::logic_error("Animation channel has no post state.");
}
channel.postState = AnimationBehaviourFromString(obs_data_get_string(chand, S_POSTSTATE));

if (!obs_data_has_user_value(chand, S_VALUES)) {
obs_data_release(chand);
obs_data_release(channels);
PLOG_ERROR("Animation '%s' channel has no values.", name.c_str());
throw std::logic_error("Animation channel has no values.");
}
const char* base64data = obs_data_get_string(chand, S_VALUES);
if (base64data[0] == '\0') {
obs_data_release(chand);
obs_data_release(channels);
PLOG_ERROR("Animation '%s' channel has empty values data.", name.c_str());
throw std::logic_error("Animation channel has empty values data.");
}
Expand All @@ -174,7 +186,9 @@ Mask::Resource::Animation::Animation(Mask::MaskData* parent, std::string name, o
channel.values.assign((float*)decoded.data(), (float*)decoded.data() + numFloats);

m_channels.emplace_back(channel);
obs_data_release(chand);
}
obs_data_release(channels);
}

Mask::Resource::Animation::~Animation() {}
Expand Down
16 changes: 13 additions & 3 deletions mask-resource-material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,10 +176,10 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
obs_data_t* eld = obs_data_item_get_obj(el);
if (!eld)
continue;
if (!obs_data_has_user_value(eld, "type"))
continue;
if (!obs_data_has_user_value(eld, "value"))
if (!obs_data_has_user_value(eld, "type")|| !obs_data_has_user_value(eld, "value")) {
obs_data_release(eld);
continue;
}

std::string type = obs_data_get_string(eld, "type");
if (type == "texture" || type == "image" || type == "sequence") {
Expand All @@ -203,6 +203,7 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
if (vector) {
param.intArray[0] = (int32_t)obs_data_get_int(vector, "x");
param.intArray[1] = (int32_t)obs_data_get_int(vector, "y");
obs_data_release(vector);
}
m_parameters.emplace(parameterName, param);
} else if (type == "integer3") {
Expand All @@ -213,6 +214,7 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
param.intArray[0] = (int32_t)obs_data_get_int(vector, "x");
param.intArray[1] = (int32_t)obs_data_get_int(vector, "y");
param.intArray[2] = (int32_t)obs_data_get_int(vector, "z");
obs_data_release(vector);
}
m_parameters.emplace(parameterName, param);
} else if (type == "integer4") {
Expand All @@ -224,6 +226,7 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
param.intArray[1] = (int32_t)obs_data_get_int(vector, "y");
param.intArray[2] = (int32_t)obs_data_get_int(vector, "z");
param.intArray[3] = (int32_t)obs_data_get_int(vector, "w");
obs_data_release(vector);
}
m_parameters.emplace(parameterName, param);
} else if (type == "integer[]") {
Expand All @@ -240,6 +243,7 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
if (vector) {
param.floatArray[0] = (float_t)obs_data_get_double(vector, "x");
param.floatArray[1] = (float_t)obs_data_get_double(vector, "y");
obs_data_release(vector);
}
m_parameters.emplace(parameterName, param);
} else if (type == "float3") {
Expand All @@ -250,6 +254,7 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
param.floatArray[0] = (float_t)obs_data_get_double(vector, "x");
param.floatArray[1] = (float_t)obs_data_get_double(vector, "y");
param.floatArray[2] = (float_t)obs_data_get_double(vector, "z");
obs_data_release(vector);
}
m_parameters.emplace(parameterName, param);
} else if (type == "float4") {
Expand All @@ -261,6 +266,7 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
param.floatArray[1] = (float_t)obs_data_get_double(vector, "y");
param.floatArray[2] = (float_t)obs_data_get_double(vector, "z");
param.floatArray[3] = (float_t)obs_data_get_double(vector, "w");
obs_data_release(vector);
}
m_parameters.emplace(parameterName, param);
} else if (type == "float[]") {
Expand All @@ -274,10 +280,14 @@ Mask::Resource::Material::Material(Mask::MaskData* parent, std::string name, obs
obs_data_get_vec4(vector, "y", &(param.matrix.x));
obs_data_get_vec4(vector, "z", &(param.matrix.x));
obs_data_get_vec4(vector, "w", &(param.matrix.x));
obs_data_release(vector);
}
m_parameters.emplace(parameterName, param);
}
obs_data_release(eld);
}
if(prmd)
obs_data_release(prmd);
}
}

Expand Down
4 changes: 4 additions & 0 deletions mask-resource-morph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ Mask::Resource::Morph::Morph(Mask::MaskData* parent, std::string name, obs_data_
// sanity check
numPoints++;
}
if (deltasItem) {
obs_data_item_release(&deltasItem);
}
obs_data_release(deltasData);
// sanity check
if (numPoints > smll::NUM_MORPH_LANDMARKS) {
PLOG_ERROR("Bad deltas section in '%s'. Too many deltas.", name.c_str());
Expand Down
13 changes: 13 additions & 0 deletions mask-resource-skinned-model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ Mask::Resource::SkinnedModel::SkinnedModel(Mask::MaskData* parent, std::string n
position.x, position.y, position.z);

matrix4_identity(&bone.global);
obs_data_release(boneData);
}

// Skins list
Expand Down Expand Up @@ -187,6 +188,18 @@ Mask::Resource::SkinnedModel::SkinnedModel(Mask::MaskData* parent, std::string n
}

m_skins.emplace_back(skin);
obs_data_release(skinData);
obs_data_release(skinBonesData);
if (skinBonesItem) {
obs_data_item_release(&skinBonesItem);
}
}
obs_data_release(skinsData);
if (bonesItem) {
obs_data_item_release(&bonesItem);
}
if (skinsItem) {
obs_data_item_release(&skinsItem);
}
}

Expand Down
96 changes: 84 additions & 12 deletions mask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,10 @@ void Mask::MaskData::Load(const std::string& file) {
std::string name = obs_data_item_get_name(itm);
GetPart(name);
}
obs_data_release(partData);
if (partDataItem) {
obs_data_item_release(&partDataItem);
}

// yield
::Sleep(0);
Expand All @@ -225,13 +229,20 @@ void Mask::MaskData::Load(const std::string& file) {
obs_data_t* resd = obs_data_item_get_obj(el);
if (!resd)
continue;
if (!obs_data_has_user_value(resd, JSON_TYPE))
if (!obs_data_has_user_value(resd, JSON_TYPE)) {
obs_data_release(resd);
continue;
}
std::string resourceType = obs_data_get_string(resd, JSON_TYPE);
if (resourceType == "animation") {
m_animations.emplace(resourceName,
std::dynamic_pointer_cast<Resource::Animation>(GetResource(resourceName)));
}
obs_data_release(resd);
}

if (resources) {
obs_data_release(resources);
}
}

Expand Down Expand Up @@ -267,24 +278,51 @@ std::shared_ptr<Mask::Resource::IBase> Mask::MaskData::GetResource(const std::st
// Lazy Loaded
obs_data_item_t* resources = obs_data_item_byname(m_data, JSON_RESOURCES);
if (!resources) return nullptr;
if (obs_data_item_gettype(resources) != OBS_DATA_OBJECT) return nullptr;
if (obs_data_item_gettype(resources) != OBS_DATA_OBJECT) {
obs_data_item_release(&resources);
return nullptr;
}
obs_data_t* resd = obs_data_item_get_obj(resources);
if (!resd) return nullptr;
if (!resd) {
obs_data_item_release(&resources);
return nullptr;
}
obs_data_item_t* element = obs_data_item_byname(resd, name.c_str());
if (!element) return nullptr;
if (!element) {
obs_data_item_release(&resources);
obs_data_release(resd);
return nullptr;
}
if (obs_data_item_gettype(element) != OBS_DATA_OBJECT) return nullptr;
obs_data_t* elmd = obs_data_item_get_obj(element);
if (!elmd) return nullptr;
if (!elmd) {
obs_data_item_release(&element);
obs_data_item_release(&resources);
obs_data_release(resd);
return nullptr;
}
try {
auto res = Resource::IBase::Load(this, name, elmd);
if (res) {
this->AddResource(name, res);
obs_data_item_release(&element);
obs_data_item_release(&resources);
obs_data_release(resd);
obs_data_release(elmd);
return res;
}
} catch (...) {
PLOG_DEBUG("Resource %s has THROWN AN EXCEPTION. MASK DID NOT LOAD CORRECTLY.", name.c_str());
obs_data_item_release(&element);
obs_data_item_release(&resources);
obs_data_release(resd);
obs_data_release(elmd);
return nullptr;
}
obs_data_item_release(&element);
obs_data_item_release(&resources);
obs_data_release(resd);
obs_data_release(elmd);
return nullptr;
}

Expand Down Expand Up @@ -360,16 +398,43 @@ std::shared_ptr<Mask::Part> Mask::MaskData::GetPart(const std::string& name) {

// Lazy Loaded
obs_data_item_t* parts = obs_data_item_byname(m_data, JSON_PARTS);
if (!parts) return nullptr;
if (obs_data_item_gettype(parts) != OBS_DATA_OBJECT) return nullptr;
if (!parts) {
return nullptr;
}
if (obs_data_item_gettype(parts) != OBS_DATA_OBJECT) {
obs_data_item_release(&parts);
return nullptr;
}
obs_data_t* resd = obs_data_item_get_obj(parts);
if (!resd) return nullptr;
if (!resd) {
obs_data_item_release(&parts);
return nullptr;
}
obs_data_item_t* element = obs_data_item_byname(resd, name.c_str());
if (!element) return nullptr;
if (obs_data_item_gettype(element) != OBS_DATA_OBJECT) return nullptr;
if (!element) {
obs_data_item_release(&parts);
obs_data_release(resd);
return nullptr;
}
if (obs_data_item_gettype(element) != OBS_DATA_OBJECT) {
obs_data_item_release(&parts);
obs_data_item_release(&element);
obs_data_release(resd);
return nullptr;
}
obs_data_t* elmd = obs_data_item_get_obj(element);
if (!elmd) return nullptr;
return LoadPart(name, elmd);
if (!elmd) {
obs_data_item_release(&parts);
obs_data_item_release(&element);
obs_data_release(resd);
return nullptr;
}
std::shared_ptr<Mask::Part> res = LoadPart(name, elmd);
obs_data_item_release(&parts);
obs_data_item_release(&element);
obs_data_release(resd);
obs_data_release(elmd);
return res;
}

std::shared_ptr<Mask::Part> Mask::MaskData::RemovePart(const std::string& name) {
Expand Down Expand Up @@ -618,12 +683,19 @@ std::shared_ptr<Mask::Part> Mask::MaskData::LoadPart(std::string name, obs_data_
obs_data_t* rezData = obs_data_item_get_obj(rezItem);
if (!rezData) {
PLOG_ERROR("Bad resources section in '%s'.", name.c_str());
if (rezItem) {
obs_data_item_release(&rezItem);
}
return current;
}
for (obs_data_item_t* itm = obs_data_first(rezData); itm; obs_data_item_next(&itm)) {
std::string resourceName = obs_data_item_get_string(itm);
current->resources.push_back(GetResource(resourceName));
}
if (rezItem) {
obs_data_item_release(&rezItem);
}
obs_data_release(rezData);
}

// Parent
Expand Down

0 comments on commit e479da3

Please sign in to comment.