From: Alexander Alekhin Date: Fri, 17 Jan 2020 13:38:58 +0000 (+0300) Subject: dnn(onnx): handle unaligned access in ONNX importer X-Git-Tag: submit/tizen/20210224.033012~2^2~331^2~9^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=55d54b56bfaf32991a45520855e46ee67940f37c;p=platform%2Fupstream%2Fopencv.git dnn(onnx): handle unaligned access in ONNX importer --- diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index 36945f5..3da494b 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -147,8 +147,18 @@ Mat getMatFromTensor(opencv_onnx::TensorProto& tensor_proto) } else { - char* val = const_cast(tensor_proto.raw_data().c_str()); - int64_t* src = reinterpret_cast(val); + const char* val = tensor_proto.raw_data().c_str(); + // Aligned pointer is required: https://github.com/opencv/opencv/issues/16373 + // this doesn't work: typedef int64_t CV_DECL_ALIGNED(1) unaligned_int64_t; + AutoBuffer aligned_val; + if (!isAligned(val)) + { + size_t sz = tensor_proto.raw_data().size(); + aligned_val.allocate(divUp(sz, sizeof(int64_t))); + memcpy(aligned_val.data(), val, sz); + val = (const char*)aligned_val.data(); + } + const int64_t* src = reinterpret_cast(val); convertInt64ToInt32(src, dst, blob.total()); } }