# HG changeset patch # User Bhavna Hariharan <bha...@multicorewareinc.com> # Date 1500874610 -19800 # Mon Jul 24 11:06:50 2017 +0530 # Branch stable # Node ID c28a95a9ebbf5bf6bb5c9a357fc11e3c3bdea35c # Parent bce945545c241ce4bb87d56d283ac8226d862ed5 Fix memory leak in hdr10plus
Rename numCimInfo and cim to m_numCimInfo and m_cim respectively. Fixes memory leaks cause due to incorrect handling of m_cim and m_userSEI memory allocation. Handle crash when empty json file is parsed. diff -r bce945545c24 -r c28a95a9ebbf source/dynamicHDR10/JsonHelper.cpp --- a/source/dynamicHDR10/JsonHelper.cpp Wed Jun 07 16:29:15 2017 +0530 +++ b/source/dynamicHDR10/JsonHelper.cpp Mon Jul 24 11:06:50 2017 +0530 @@ -188,9 +188,15 @@ tfile.close(); - size_t beginning = json_str2.find_first_of("["); - int fixchar = json_str2[json_str2.size() - 2] == ']' ? 1 : 0; - return Json::parse(json_str2.substr(beginning,json_str2.size() - fixchar),err).array_items(); + vector<Json> data; + if (json_str2.size() != 0) + { + size_t beginning = json_str2.find_first_of("["); + int fixchar = json_str2[json_str2.size() - 2] == ']' ? 1 : 0; + return Json::parse(json_str2.substr(beginning, json_str2.size() - fixchar), err).array_items(); + } + else + return data; } bool JsonHelper::validatePathExtension(string &path) diff -r bce945545c24 -r c28a95a9ebbf source/encoder/encoder.cpp --- a/source/encoder/encoder.cpp Wed Jun 07 16:29:15 2017 +0530 +++ b/source/encoder/encoder.cpp Mon Jul 24 11:06:50 2017 +0530 @@ -88,8 +88,8 @@ #if ENABLE_DYNAMIC_HDR10 m_hdr10plus_api = hdr10plus_api_get(); - numCimInfo = 0; - cim = NULL; + m_numCimInfo = 0; + m_cim = NULL; #endif m_prevTonemapPayload.payload = NULL; @@ -403,6 +403,11 @@ m_nalList.m_annexB = !!m_param->bAnnexB; m_emitCLLSEI = p->maxCLL || p->maxFALL; + +#if ENABLE_DYNAMIC_HDR10 + if (m_bToneMap) + m_numCimInfo = m_hdr10plus_api->hdr10plus_json_to_movie_cim(m_param->toneMapFile, m_cim); +#endif } void Encoder::stopJobs() @@ -434,7 +439,8 @@ void Encoder::destroy() { #if ENABLE_DYNAMIC_HDR10 - m_hdr10plus_api->hdr10plus_clear_movie(cim, numCimInfo); + if (m_bToneMap) + m_hdr10plus_api->hdr10plus_clear_movie(m_cim, m_numCimInfo); #endif if (m_exportedPic) @@ -610,19 +616,18 @@ #if ENABLE_DYNAMIC_HDR10 if (m_bToneMap) { - if (pic_in->poc == 0) - numCimInfo = m_hdr10plus_api->hdr10plus_json_to_movie_cim(m_param->toneMapFile, cim); - if (pic_in->poc < numCimInfo) + int currentPOC = m_pocLast + 1; + if (currentPOC < m_numCimInfo) { int32_t i = 0; toneMap.payloadSize = 0; - while (cim[pic_in->poc][i] == 0xFF) - toneMap.payloadSize += cim[pic_in->poc][i++] + 1; - toneMap.payloadSize += cim[pic_in->poc][i] + 1; + while (m_cim[currentPOC][i] == 0xFF) + toneMap.payloadSize += m_cim[currentPOC][i++] + 1; + toneMap.payloadSize += m_cim[currentPOC][i] + 1; toneMap.payload = (uint8_t*)x265_malloc(sizeof(uint8_t) * toneMap.payloadSize); toneMap.payloadType = USER_DATA_REGISTERED_ITU_T_T35; - memcpy(toneMap.payload, cim[pic_in->poc], toneMap.payloadSize); + memcpy(toneMap.payload, m_cim[currentPOC], toneMap.payloadSize); } } #endif @@ -716,7 +721,12 @@ if (inFrame->m_userSEI.numPayloads) { - inFrame->m_userSEI.payloads = new x265_sei_payload[numPayloads]; + if (!inFrame->m_userSEI.payloads) + { + inFrame->m_userSEI.payloads = new x265_sei_payload[numPayloads]; + for (int i = 0; i < numPayloads; i++) + inFrame->m_userSEI.payloads[i].payload = NULL; + } for (int i = 0; i < numPayloads; i++) { x265_sei_payload input; @@ -726,7 +736,8 @@ input = pic_in->userSEI.payloads[i]; int size = inFrame->m_userSEI.payloads[i].payloadSize = input.payloadSize; inFrame->m_userSEI.payloads[i].payloadType = input.payloadType; - inFrame->m_userSEI.payloads[i].payload = new uint8_t[size]; + if (!inFrame->m_userSEI.payloads[i].payload) + inFrame->m_userSEI.payloads[i].payload = new uint8_t[size]; memcpy(inFrame->m_userSEI.payloads[i].payload, input.payload, size); } if (toneMap.payload) diff -r bce945545c24 -r c28a95a9ebbf source/encoder/encoder.h --- a/source/encoder/encoder.h Wed Jun 07 16:29:15 2017 +0530 +++ b/source/encoder/encoder.h Mon Jul 24 11:06:50 2017 +0530 @@ -178,8 +178,8 @@ #ifdef ENABLE_DYNAMIC_HDR10 const hdr10plus_api *m_hdr10plus_api; - uint8_t **cim; - int numCimInfo; + uint8_t **m_cim; + int m_numCimInfo; #endif x265_sei_payload m_prevTonemapPayload;
# HG changeset patch # User Bhavna Hariharan <bha...@multicorewareinc.com> # Date 1500874610 -19800 # Mon Jul 24 11:06:50 2017 +0530 # Branch stable # Node ID c28a95a9ebbf5bf6bb5c9a357fc11e3c3bdea35c # Parent bce945545c241ce4bb87d56d283ac8226d862ed5 Fix memory leak in hdr10plus Rename numCimInfo and cim to m_numCimInfo and m_cim respectively. Fixes memory leaks cause due to incorrect handling of m_cim and m_userSEI memory allocation. Handle crash when empty json file is parsed. diff -r bce945545c24 -r c28a95a9ebbf source/dynamicHDR10/JsonHelper.cpp --- a/source/dynamicHDR10/JsonHelper.cpp Wed Jun 07 16:29:15 2017 +0530 +++ b/source/dynamicHDR10/JsonHelper.cpp Mon Jul 24 11:06:50 2017 +0530 @@ -188,9 +188,15 @@ tfile.close(); - size_t beginning = json_str2.find_first_of("["); - int fixchar = json_str2[json_str2.size() - 2] == ']' ? 1 : 0; - return Json::parse(json_str2.substr(beginning,json_str2.size() - fixchar),err).array_items(); + vector<Json> data; + if (json_str2.size() != 0) + { + size_t beginning = json_str2.find_first_of("["); + int fixchar = json_str2[json_str2.size() - 2] == ']' ? 1 : 0; + return Json::parse(json_str2.substr(beginning, json_str2.size() - fixchar), err).array_items(); + } + else + return data; } bool JsonHelper::validatePathExtension(string &path) diff -r bce945545c24 -r c28a95a9ebbf source/encoder/encoder.cpp --- a/source/encoder/encoder.cpp Wed Jun 07 16:29:15 2017 +0530 +++ b/source/encoder/encoder.cpp Mon Jul 24 11:06:50 2017 +0530 @@ -88,8 +88,8 @@ #if ENABLE_DYNAMIC_HDR10 m_hdr10plus_api = hdr10plus_api_get(); - numCimInfo = 0; - cim = NULL; + m_numCimInfo = 0; + m_cim = NULL; #endif m_prevTonemapPayload.payload = NULL; @@ -403,6 +403,11 @@ m_nalList.m_annexB = !!m_param->bAnnexB; m_emitCLLSEI = p->maxCLL || p->maxFALL; + +#if ENABLE_DYNAMIC_HDR10 + if (m_bToneMap) + m_numCimInfo = m_hdr10plus_api->hdr10plus_json_to_movie_cim(m_param->toneMapFile, m_cim); +#endif } void Encoder::stopJobs() @@ -434,7 +439,8 @@ void Encoder::destroy() { #if ENABLE_DYNAMIC_HDR10 - m_hdr10plus_api->hdr10plus_clear_movie(cim, numCimInfo); + if (m_bToneMap) + m_hdr10plus_api->hdr10plus_clear_movie(m_cim, m_numCimInfo); #endif if (m_exportedPic) @@ -610,19 +616,18 @@ #if ENABLE_DYNAMIC_HDR10 if (m_bToneMap) { - if (pic_in->poc == 0) - numCimInfo = m_hdr10plus_api->hdr10plus_json_to_movie_cim(m_param->toneMapFile, cim); - if (pic_in->poc < numCimInfo) + int currentPOC = m_pocLast + 1; + if (currentPOC < m_numCimInfo) { int32_t i = 0; toneMap.payloadSize = 0; - while (cim[pic_in->poc][i] == 0xFF) - toneMap.payloadSize += cim[pic_in->poc][i++] + 1; - toneMap.payloadSize += cim[pic_in->poc][i] + 1; + while (m_cim[currentPOC][i] == 0xFF) + toneMap.payloadSize += m_cim[currentPOC][i++] + 1; + toneMap.payloadSize += m_cim[currentPOC][i] + 1; toneMap.payload = (uint8_t*)x265_malloc(sizeof(uint8_t) * toneMap.payloadSize); toneMap.payloadType = USER_DATA_REGISTERED_ITU_T_T35; - memcpy(toneMap.payload, cim[pic_in->poc], toneMap.payloadSize); + memcpy(toneMap.payload, m_cim[currentPOC], toneMap.payloadSize); } } #endif @@ -716,7 +721,12 @@ if (inFrame->m_userSEI.numPayloads) { - inFrame->m_userSEI.payloads = new x265_sei_payload[numPayloads]; + if (!inFrame->m_userSEI.payloads) + { + inFrame->m_userSEI.payloads = new x265_sei_payload[numPayloads]; + for (int i = 0; i < numPayloads; i++) + inFrame->m_userSEI.payloads[i].payload = NULL; + } for (int i = 0; i < numPayloads; i++) { x265_sei_payload input; @@ -726,7 +736,8 @@ input = pic_in->userSEI.payloads[i]; int size = inFrame->m_userSEI.payloads[i].payloadSize = input.payloadSize; inFrame->m_userSEI.payloads[i].payloadType = input.payloadType; - inFrame->m_userSEI.payloads[i].payload = new uint8_t[size]; + if (!inFrame->m_userSEI.payloads[i].payload) + inFrame->m_userSEI.payloads[i].payload = new uint8_t[size]; memcpy(inFrame->m_userSEI.payloads[i].payload, input.payload, size); } if (toneMap.payload) diff -r bce945545c24 -r c28a95a9ebbf source/encoder/encoder.h --- a/source/encoder/encoder.h Wed Jun 07 16:29:15 2017 +0530 +++ b/source/encoder/encoder.h Mon Jul 24 11:06:50 2017 +0530 @@ -178,8 +178,8 @@ #ifdef ENABLE_DYNAMIC_HDR10 const hdr10plus_api *m_hdr10plus_api; - uint8_t **cim; - int numCimInfo; + uint8_t **m_cim; + int m_numCimInfo; #endif x265_sei_payload m_prevTonemapPayload;
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel