| 7983 | } |
| 7984 | |
| 7985 | int ParseEXRHeaderFromMemory(EXRHeader *exr_header, const EXRVersion *version, |
| 7986 | const unsigned char *memory, size_t size, |
| 7987 | const char **err) { |
| 7988 | if (memory == NULL || exr_header == NULL) { |
| 7989 | tinyexr::SetErrorMessage( |
| 7990 | "Invalid argument. `memory` or `exr_header` argument is null in " |
| 7991 | "ParseEXRHeaderFromMemory()", |
| 7992 | err); |
| 7993 | |
| 7994 | // Invalid argument |
| 7995 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 7996 | } |
| 7997 | |
| 7998 | if (size < tinyexr::kEXRVersionSize) { |
| 7999 | tinyexr::SetErrorMessage("Insufficient header/data size.\n", err); |
| 8000 | return TINYEXR_ERROR_INVALID_DATA; |
| 8001 | } |
| 8002 | |
| 8003 | const unsigned char *marker = memory + tinyexr::kEXRVersionSize; |
| 8004 | size_t marker_size = size - tinyexr::kEXRVersionSize; |
| 8005 | |
| 8006 | tinyexr::HeaderInfo info; |
| 8007 | info.clear(); |
| 8008 | |
| 8009 | int ret; |
| 8010 | { |
| 8011 | std::string err_str; |
| 8012 | ret = ParseEXRHeader(&info, NULL, version, &err_str, marker, marker_size); |
| 8013 | |
| 8014 | if (ret != TINYEXR_SUCCESS) { |
| 8015 | if (err && !err_str.empty()) { |
| 8016 | tinyexr::SetErrorMessage(err_str, err); |
| 8017 | } |
| 8018 | } |
| 8019 | } |
| 8020 | |
| 8021 | { |
| 8022 | std::string warn; |
| 8023 | std::string err_str; |
| 8024 | |
| 8025 | if (!ConvertHeader(exr_header, info, &warn, &err_str)) { |
| 8026 | // release mem |
| 8027 | for (size_t i = 0; i < info.attributes.size(); i++) { |
| 8028 | if (info.attributes[i].value) { |
| 8029 | free(info.attributes[i].value); |
| 8030 | } |
| 8031 | } |
| 8032 | if (err && !err_str.empty()) { |
| 8033 | tinyexr::SetErrorMessage(err_str, err); |
| 8034 | } |
| 8035 | ret = TINYEXR_ERROR_INVALID_HEADER; |
| 8036 | } |
| 8037 | } |
| 8038 | |
| 8039 | exr_header->multipart = version->multipart ? 1 : 0; |
| 8040 | exr_header->non_image = version->non_image ? 1 : 0; |
| 8041 | |
| 8042 | return ret; |
no test coverage detected