Let we exist bvh parsing when it have some invalid informations.
Change-Id: I82f090b6207911ef9c49cbbbba8123c6cdeb46ab
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+}
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+}
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ OFFSET 0 0 0
+ }
+ }
+}
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ OFFSET 0 0 0
+ }
+}
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ {
+ OFFSET 0 0 0
+ }
+ }
+ }
+}
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ {
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+ }
+}
+MOTION
+Frames: 2
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+}
+MOTION
+Frames: 3
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+}
+MOTION
+Frames: 1
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+}
+MOTION
+Frame Time: 0.3
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
--- /dev/null
+HIERARCHY
+ROOT root
+{
+ OFFSET 0.0 -0.948831 1.32574
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ JOINT first
+ {
+ OFFSET -0.0 4.130377 -0.008512
+ CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
+ End Site
+ {
+ OFFSET 0 0 0
+ }
+ }
+}
+MOTION
+Frames: 2
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 10.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0 90.0 0.0 0.0
\ No newline at end of file
AnimationDefinition animDef = LoadBvhFromBuffer(nullptr, 0, "testBvh");
DALI_TEST_EQUALS(0u, animDef.GetPropertyCount(), TEST_LOCATION);
END_TEST;
+}
+
+int UtcDaliLoadBvhFailed03(void)
+{
+ TestApplication application;
+
+ tet_infoline("Parse error for hierarchy1");
+ uint32_t caseHierarchyCount = 8;
+ for(uint32_t tc = 0; tc < caseHierarchyCount; ++tc)
+ {
+ tet_printf("Parse error for hierarchy %u\n", tc);
+ std::ostringstream oss;
+ oss << TEST_RESOURCE_DIR << "/test-invalid-hierarchy" << tc << ".bvh";
+ AnimationDefinition animDef = LoadBvh(oss.str(), "testBvh");
+ DALI_TEST_EQUALS(0u, animDef.GetPropertyCount(), TEST_LOCATION);
+ }
+
+ uint32_t caseMotionCount = 4;
+ for(uint32_t tc = 0; tc < caseMotionCount; ++tc)
+ {
+ tet_printf("Parse error for motion %u\n", tc);
+ std::ostringstream oss;
+ oss << TEST_RESOURCE_DIR << "/test-invalid-motion" << tc << ".bvh";
+ AnimationDefinition animDef = LoadBvh(oss.str(), "testBvh");
+ DALI_TEST_EQUALS(0u, animDef.GetPropertyCount(), TEST_LOCATION);
+ }
+
+ {
+ tet_infoline("empty file");
+ AnimationDefinition animDef = LoadBvh(TEST_RESOURCE_DIR "/test-empty.bvh", "testBvh");
+ DALI_TEST_EQUALS(0u, animDef.GetPropertyCount(), TEST_LOCATION);
+ }
+ END_TEST;
}
\ No newline at end of file
static constexpr std::string_view TOKEN_MOTION = "MOTION";
static constexpr std::string_view PROPERTY_NAME_POSITION = "position";
static constexpr std::string_view PROPERTY_NAME_ORIENTATION = "orientation";
+static constexpr std::string_view TOKEN_OPENING_BRACE = "{";
static constexpr std::string_view TOKEN_CLOSING_BRACE = "}";
enum class Channel
s.end());
}
-void ParseHierarchy(std::istream& file, std::shared_ptr<Joint>& joint)
+bool ParseHierarchy(std::istream& file, std::shared_ptr<Joint>& joint)
{
std::string line;
+ bool braceExist = false;
while(std::getline(file, line))
{
trim(line);
joint->children.push_back(child);
std::getline(stream, token, ' ');
child->name = token;
- ParseHierarchy(file, child);
+
+ if(DALI_UNLIKELY(!ParseHierarchy(file, child)))
+ {
+ return false;
+ }
}
else if(line == TOKEN_END_SITE.data())
{
+ bool braceExistEndSite = false;
while(std::getline(file, line))
{
trim(line);
- if(line == TOKEN_CLOSING_BRACE.data())
+ if(line == TOKEN_OPENING_BRACE.data())
+ {
+ if(DALI_UNLIKELY(braceExistEndSite))
+ {
+ DALI_LOG_ERROR("Parsing error : Joint[%s] End Site opening brace not matched\n", joint->name.c_str());
+ return false;
+ }
+ braceExistEndSite = true;
+ }
+ else if(line == TOKEN_CLOSING_BRACE.data())
{
+ if(DALI_UNLIKELY(!braceExistEndSite))
+ {
+ DALI_LOG_ERROR("Parsing error : Joint[%s] End Site closing brace not matched\n", joint->name.c_str());
+ return false;
+ }
break;
}
}
+ if(DALI_UNLIKELY(!braceExistEndSite))
+ {
+ DALI_LOG_ERROR("Parsing error : Joint[%s] End Site opening brace not exist\n", joint->name.c_str());
+ return false;
+ }
+ }
+ else if(line == TOKEN_OPENING_BRACE.data())
+ {
+ if(DALI_UNLIKELY(braceExist))
+ {
+ DALI_LOG_ERROR("Parsing error : Joint[%s] opening brace not matched\n", joint->name.c_str());
+ return false;
+ }
+ braceExist = true;
}
else if(token == TOKEN_CLOSING_BRACE.data())
{
+ if(DALI_UNLIKELY(!braceExist))
+ {
+ DALI_LOG_ERROR("Parsing error : Joint[%s] closing brace not matched\n", joint->name.c_str());
+ return false;
+ }
break;
}
}
+ if(DALI_UNLIKELY(!braceExist))
+ {
+ DALI_LOG_ERROR("Parsing error : Joint[%s] opening brace not exist\n", joint->name.c_str());
+ return false;
+ }
+ return true;
}
void MakeList(std::shared_ptr<Joint>& joint, std::vector<std::shared_ptr<Joint>>& jointList)
}
}
-void ParseMotion(std::istream& file, std::shared_ptr<Joint>& hierarchy, uint32_t& frameCount, float& frameTime)
+bool ParseMotion(std::istream& file, std::shared_ptr<Joint>& hierarchy, uint32_t& frameCount, float& frameTime)
{
std::vector<std::shared_ptr<Joint>> jointList;
MakeList(hierarchy, jointList);
}
}
+ if(DALI_UNLIKELY(!frameCountLoaded))
+ {
+ DALI_LOG_ERROR("Parsing error : Frames not exist!\n");
+ return false;
+ }
+ if(DALI_UNLIKELY(!frameTimeLoaded))
+ {
+ DALI_LOG_ERROR("Parsing error : Frame Time not exist!\n");
+ return false;
+ }
+
+ uint32_t loadedFrameCount = 0u;
+
while(std::getline(file, line))
{
trim(line);
+ if(DALI_UNLIKELY(line.empty()))
+ {
+ continue;
+ }
std::istringstream stream(line);
+ if(DALI_UNLIKELY(++loadedFrameCount > frameCount))
+ {
+ // Parse failed. Just skip decoding, and get the number of line for debug.
+ continue;
+ }
+
for(auto&& joint : jointList)
{
Vector3 translation;
joint->rotations.push_back(rotation[2] * rotation[0] * rotation[1]);
}
}
+
+ if(DALI_UNLIKELY(loadedFrameCount != frameCount))
+ {
+ DALI_LOG_ERROR("Parsing error : Motion frame count not matched! expect : %u, loaded : %u\n", frameCount, loadedFrameCount);
+ return false;
+ }
+
+ return true;
}
bool ParseBvh(std::istream& file, uint32_t& frameCount, float& frameTime, std::shared_ptr<Joint>& rootJoint)
{
std::string line;
+ bool parseHierarchy = false;
+ bool parseMotion = false;
while(std::getline(file, line))
{
trim(line);
{
std::getline(stream, token, ' ');
rootJoint->name = token;
- ParseHierarchy(file, rootJoint);
+ parseHierarchy = ParseHierarchy(file, rootJoint);
break;
}
}
}
if(token == TOKEN_MOTION.data())
{
- ParseMotion(file, rootJoint, frameCount, frameTime);
+ parseMotion = ParseMotion(file, rootJoint, frameCount, frameTime);
}
}
- return true;
+ return parseHierarchy && parseMotion;
}
AnimationDefinition GenerateAnimation(const std::string& animationName, std::shared_ptr<Joint>& hierarchy, uint32_t frameCount, float frameTime, const Vector3& scale)