[x265] [PATCH 3/3] SEI Memory Leak Fix
Pavan Tarun Chakka Venkata
pavan.tarun at multicorewareinc.com
Tue Nov 12 14:55:30 UTC 2024
On Tue, Nov 12, 2024 at 7:48 PM Andrey Semashev <andrey.semashev at gmail.com>
wrote:
> On 11/12/24 16:20, Pavan Tarun Chakka Venkata wrote:
>
> This patch has broken indentation (using tabs).
Thanks for pointing this out, I missed this while rebasing.
Will send an updated patch.
> From 52d1f689c5bcc8a6b913e55094d0dcc03a7ff809 Mon Sep 17 00:00:00 2001
> > From: PavanTarun <pavan.tarun at multicorewareinc.com
> > <mailto:pavan.tarun at multicorewareinc.com>>
> > Date: Sat, 9 Nov 2024 13:18:18 +0530
> > Subject: [PATCH 3/3] SEI Memory Leak Fix
> >
> > ---
> > source/encoder/encoder.cpp | 5 +-
> > source/encoder/sei.cpp | 102 +++++++++++++++++--------------------
> > source/encoder/sei.h | 2 +-
> > 3 files changed, 53 insertions(+), 56 deletions(-)
> >
> > diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
> > index eef7519a1..db6d746e3 100644
> > --- a/source/encoder/encoder.cpp
> > +++ b/source/encoder/encoder.cpp
> > @@ -6127,7 +6127,9 @@ void Encoder::readUserSeiFile(x265_sei_payload&
> > seiMsg, int curPoc)
> > int payloadType = atoi(strtok(NULL, " "));
> > char *base64Encode = strtok(NULL, "\n");
> > int base64EncodeLength = (int)strlen(base64Encode);
> > - char *base64Decode = SEI::base64Decode(base64Encode,
> > base64EncodeLength);
> > + char* decodedString;
> > + decodedString = (char*)malloc(sizeof(char) * (base64EncodeLength));
> > + char *base64Decode = SEI::base64Decode(base64Encode,
> > base64EncodeLength, decodedString);
> > if (nalType == NAL_UNIT_PREFIX_SEI && (!strcmp(prefix,
> "PREFIX")))
> > {
> > int currentPOC = curPoc;
> > @@ -6150,6 +6152,7 @@ void Encoder::readUserSeiFile(x265_sei_payload&
> > seiMsg, int curPoc)
> > break;
> > }
> > memcpy(seiMsg.payload, base64Decode,
> seiMsg.payloadSize);
> > + free(decodedString);
> > break;
> > }
> > }
> > diff --git a/source/encoder/sei.cpp b/source/encoder/sei.cpp
> > index 6e4b805e5..85cd7894a 100644
> > --- a/source/encoder/sei.cpp
> > +++ b/source/encoder/sei.cpp
> > @@ -92,60 +92,54 @@ void SEI::setSize(uint32_t size)
> >
> > /* charSet =
> > "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" */
> >
> > -char* SEI::base64Decode(char encodedString[], int base64EncodeLength)
> > +char* SEI::base64Decode(char encodedString[], int base64EncodeLength,
> > char* decodedString)
> > {
> > - char* decodedString;
> > - decodedString = (char*)malloc(sizeof(char) * ((base64EncodeLength /
> > 4) * 3));
> > - int i, j, k = 0;
> > - // stores the bitstream
> > - int bitstream = 0;
> > - // countBits stores current number of bits in bitstream
> > - int countBits = 0;
> > - // selects 4 characters from encodedString at a time. Find the
> > position of each encoded character in charSet and stores in bitstream
> > - for (i = 0; i < base64EncodeLength; i += 4)
> > - {
> > - bitstream = 0, countBits = 0;
> > - for (j = 0; j < 4; j++)
> > - {
> > - // make space for 6 bits
> > - if (encodedString[i + j] != '=')
> > - {
> > - bitstream = bitstream << 6;
> > - countBits += 6;
> > - }
> > - // Finding the position of each encoded character in
> > charSet and storing in bitstream, use OR '|' operator to store bits
> > -
> > - if (encodedString[i + j] >= 'A' && encodedString[i + j] <=
> 'Z')
> > - bitstream = bitstream | (encodedString[i + j] - 'A');
> > -
> > - else if (encodedString[i + j] >= 'a' && encodedString[i +
> > j] <= 'z')
> > - bitstream = bitstream | (encodedString[i + j] - 'a' +
> 26);
> > -
> > - else if (encodedString[i + j] >= '0' && encodedString[i +
> > j] <= '9')
> > - bitstream = bitstream | (encodedString[i + j] - '0' +
> 52);
> > -
> > - // '+' occurs in 62nd position in charSet
> > - else if (encodedString[i + j] == '+')
> > - bitstream = bitstream | 62;
> > -
> > - // '/' occurs in 63rd position in charSet
> > - else if (encodedString[i + j] == '/')
> > - bitstream = bitstream | 63;
> > -
> > - // to delete appended bits during encoding
> > - else
> > - {
> > - bitstream = bitstream >> 2;
> > - countBits -= 2;
> > - }
> > - }
> > -
> > - while (countBits != 0)
> > - {
> > - countBits -= 8;
> > - decodedString[k++] = (bitstream >> countBits) & 255;
> > - }
> > - }
> > - return decodedString;
> > + int i, j, k = 0;
> > + // stores the bitstream
> > + int bitstream = 0;
> > + // countBits stores the current number of bits in bitstream
> > + int countBits = 0;
> > +
> > + for (i = 0; i < base64EncodeLength; i += 4)
> > + {
> > + bitstream = 0;
> > + countBits = 0;
> > +
> > + for (j = 0; j < 4; j++)
> > + {
> > + if (encodedString[i + j] != '=')
> > + {
> > + int value = 0;
> > + if (encodedString[i + j] >= 'A' && encodedString[i + j] <= 'Z')
> > + value = encodedString[i + j] - 'A';
> > + else if (encodedString[i + j] >= 'a' && encodedString[i + j] <= 'z')
> > + value = encodedString[i + j] - 'a' + 26;
> > + else if (encodedString[i + j] >= '0' && encodedString[i + j] <= '9')
> > + value = encodedString[i + j] - '0' + 52;
> > + else if (encodedString[i + j] == '+')
> > + value = 62;
> > + else if (encodedString[i + j] == '/')
> > + value = 63;
> > + else
> > + value = 0;
> > +
> > + bitstream = (bitstream << 6) | value;
> > + countBits += 6;
> > + }
> > + }
> > +
> > + while (countBits >= 8)
> > + {
> > + countBits -= 8;
> > + decodedString[k++] = (bitstream >> countBits) & 0xFF;
> > + }
> > + }
> > +
> > + if (k < base64EncodeLength)
> > + {
> > + decodedString[k] = '\0';
> > + }
> > +
> > + return decodedString;
> > }
> >
> > diff --git a/source/encoder/sei.h b/source/encoder/sei.h
> > index a33cb94e9..f02e0c50d 100644
> > --- a/source/encoder/sei.h
> > +++ b/source/encoder/sei.h
> > @@ -40,7 +40,7 @@ public:
> > * The writeSEImessages() method calls writeSEI() which encodes the
> > header */
> > void writeSEImessages(Bitstream& bs, const SPS& sps, NalUnitType
> > nalUnitType, NALList& list, int isNested, int layerId = 0);
> > void setSize(uint32_t size);
> > - static char* base64Decode(char encodedString[], int
> > base64EncodeLength);
> > + static char* base64Decode(char encodedString[], int
> > base64EncodeLength, char* base64Decode);
> > virtual ~SEI() {}
> > protected:
> > SEIPayloadType m_payloadType;
> > --
> > 2.41.0.windows.1
> >
> >
> > _______________________________________________
> > x265-devel mailing list
> > x265-devel at videolan.org
> > https://mailman.videolan.org/listinfo/x265-devel
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
Thanks,
Pavan Tarun
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20241112/ead4d064/attachment.htm>
More information about the x265-devel
mailing list