Skip to content
This repository has been archived by the owner on Dec 21, 2020. It is now read-only.

Commit

Permalink
Merge pull request #36 from MaxKellermann/leak
Browse files Browse the repository at this point in the history
Code cleanup, memory leak fixes and crash bug fixes
  • Loading branch information
FernetMenta committed Dec 9, 2015
2 parents 3f42c55 + 178a4d7 commit 52f511a
Show file tree
Hide file tree
Showing 12 changed files with 149 additions and 180 deletions.
9 changes: 3 additions & 6 deletions channelscancontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@ using namespace WIRBELSCAN_SERVICE;
#define SCANDONE 2
#define CHECKVERSION(a,b,c) p=strchr((char *) m_scanInformation->a,'#') + 1; sscanf(p,"%d ",&version); if (version < b) c = true;
#define CHECKLIMITS(a,v,_min,_max,_def) a=v; if ((a<_min) || (a>_max)) a=_def;
#define freeAndNull(p) if(p) { free(p); p=NULL; }
#define deleteAndNull(p) if(p) { delete(p); p=NULL; }

CScanControl::CScanControl(cVNSIClient *client)
: m_client(client),
Expand All @@ -71,10 +69,9 @@ CScanControl::CScanControl(cVNSIClient *client)

CScanControl::~CScanControl()
{
if (m_scanInformation)
delete m_scanInformation;
freeAndNull(m_cbuf);
freeAndNull(m_sbuf);
delete m_scanInformation;
free(m_cbuf);
free(m_sbuf);
}

bool CScanControl::IsSupported()
Expand Down
9 changes: 5 additions & 4 deletions parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ cParser::cParser(int pID, cTSStream *stream, sPtsWrap *ptsWrap, bool observePtsW

cParser::~cParser()
{
if (m_PesBuffer)
free(m_PesBuffer);
free(m_PesBuffer);
}

void cParser::Reset()
Expand Down Expand Up @@ -370,13 +369,15 @@ bool cParser::AddPESPacket(uint8_t *data, int size)
return false;
}
m_PesBufferSize += m_PesBufferInitialSize / 10;
m_PesBuffer = (uint8_t*)realloc(m_PesBuffer, m_PesBufferSize);
if (m_PesBuffer == NULL)
uint8_t *new_buffer = (uint8_t*)realloc(m_PesBuffer, m_PesBufferSize);
if (new_buffer == NULL)
{
ERRORLOG("cParser::AddPESPacket - realloc failed");
Reset();
return false;
}

m_PesBuffer = new_buffer;
}

// copy first packet of new frame to front
Expand Down
14 changes: 6 additions & 8 deletions parser_MPEGAudio.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,7 @@ cParserMPEG2Audio::cParserMPEG2Audio(int pID, cTSStream *stream, sPtsWrap *ptsWr

cParserMPEG2Audio::~cParserMPEG2Audio()
{
if (m_RDSBuffer)
{
delete m_RDSBuffer;
m_RDSBuffer = NULL;
}
free(m_RDSBuffer);
}

void cParserMPEG2Audio::Parse(sStreamPacket *pkt, sStreamPacket *pkt_side_data)
Expand Down Expand Up @@ -140,14 +136,16 @@ void cParserMPEG2Audio::Parse(sStreamPacket *pkt, sStreamPacket *pkt_side_data)
return;
}
m_RDSBufferSize += m_RDSBufferInitialSize / 10;
m_RDSBuffer = (uint8_t*)realloc(m_RDSBuffer, m_RDSBufferSize);
if (m_RDSBuffer == NULL)
uint8_t *new_buffer = (uint8_t *)realloc(m_RDSBuffer, m_RDSBufferSize);
if (new_buffer == NULL)
{
ERRORLOG("PVR Parser MPEG2-Audio - %s - realloc for RDS data failed", __FUNCTION__);
m_RDSEnabled = false;
return;
}
}

m_RDSBuffer = new_buffer;
}

int pes_buffer_ptr = 0;
for (int i = m_FrameSize-3; i > m_FrameSize-3-rdsl; i--) // <-- data reverse, from end to start
Expand Down
102 changes: 46 additions & 56 deletions recplayer.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,30 +39,27 @@
#endif

cRecPlayer::cRecPlayer(const cRecording* rec, bool inProgress)
{
m_file = -1;
m_fileOpen = -1;
m_recordingFilename = strdup(rec->FileName());
m_inProgress = inProgress;

// FIXME find out max file path / name lengths
:m_inProgress(inProgress),
m_recordingFilename(rec->FileName()),
#if VDRVERSNUM < 10703
m_pesrecording = true;
m_indexFile = new cIndexFile(m_recordingFilename, false);
m_pesrecording(true),
m_indexFile(m_recordingFilename.c_str(), false),
#else
m_pesrecording = rec->IsPesRecording();
if(m_pesrecording) INFOLOG("recording '%s' is a PES recording", m_recordingFilename);
m_indexFile = new cIndexFile(m_recordingFilename, false, m_pesrecording);
m_pesrecording(rec->IsPesRecording()),
m_indexFile(m_recordingFilename.c_str(), false, m_pesrecording),
#endif
m_file(-1), m_fileOpen(-1)
{
// FIXME find out max file path / name lengths
#if VDRVERSNUM >= 10703
if(m_pesrecording) INFOLOG("recording '%s' is a PES recording", m_recordingFilename.c_str());
#endif

scan();
}

void cRecPlayer::cleanup() {
for(int i = 0; i != m_segments.Size(); i++) {
delete m_segments[i];
}
m_segments.Clear();
m_segments.clear();
}

void cRecPlayer::scan()
Expand All @@ -85,17 +82,17 @@ void cRecPlayer::scan()
break;
}

cSegment* segment = new cSegment();
segment->start = m_totalLength;
segment->end = segment->start + s.st_size;
cSegment segment;
segment.start = m_totalLength;
segment.end = segment.start + s.st_size;

m_segments.Append(segment);
m_segments.push_back(segment);

m_totalLength += s.st_size;
INFOLOG("File %i found, size: %lu, totalLength now %lu", i, s.st_size, m_totalLength);
}

m_totalFrames = m_indexFile->Last();
m_totalFrames = m_indexFile.Last();
INFOLOG("total frames: %u", m_totalFrames);
}

Expand All @@ -114,36 +111,35 @@ void cRecPlayer::reScan()
}

cSegment* segment;
if (m_segments.Size() < i+1)
if (m_segments.size() < i+1)
{
segment = new cSegment();
m_segments.Append(segment);
m_segments.push_back(cSegment());
segment = &m_segments.back();
segment->start = m_totalLength;
}
else
segment = m_segments[i];
segment = &m_segments[i];

segment->end = segment->start + s.st_size;

m_totalLength += s.st_size;
}

m_totalFrames = m_indexFile->Last();
m_totalFrames = m_indexFile.Last();
}


cRecPlayer::~cRecPlayer()
{
cleanup();
closeFile();
free(m_recordingFilename);
}

char* cRecPlayer::fileNameFromIndex(int index) {
if (m_pesrecording)
snprintf(m_fileName, sizeof(m_fileName), "%s/%03i.vdr", m_recordingFilename, index+1);
snprintf(m_fileName, sizeof(m_fileName), "%s/%03i.vdr", m_recordingFilename.c_str(), index+1);
else
snprintf(m_fileName, sizeof(m_fileName), "%s/%05i.ts", m_recordingFilename, index+1);
snprintf(m_fileName, sizeof(m_fileName), "%s/%05i.ts", m_recordingFilename.c_str(), index+1);

return m_fileName;
}
Expand Down Expand Up @@ -212,25 +208,25 @@ int cRecPlayer::getBlock(unsigned char* buffer, uint64_t position, int amount)
amount = m_totalLength - position;

// work out what block "position" is in
int segmentNumber = -1;
for(int i = 0; i < m_segments.Size(); i++)
{
if ((position >= m_segments[i]->start) && (position < m_segments[i]->end)) {
segmentNumber = i;
std::vector<cSegment>::iterator begin = m_segments.begin(),
end = m_segments.end(), segmentIterator = end;
for (std::vector<cSegment>::iterator i = begin; i != end; ++i) {
if ((position >= i->start) && (position < i->end)) {
segmentIterator = i;
break;
}
}

// segment not found / invalid position
if (segmentNumber == -1)
if (segmentIterator == end)
return 0;

// open file (if not already open)
if (!openFile(segmentNumber))
if (!openFile(std::distance(begin, segmentIterator)))
return 0;

// work out position in current file
uint64_t filePosition = position - m_segments[segmentNumber]->start;
uint64_t filePosition = position - segmentIterator->start;

// seek to position
if(lseek(m_file, filePosition, SEEK_SET) == -1)
Expand Down Expand Up @@ -264,8 +260,6 @@ int cRecPlayer::getBlock(unsigned char* buffer, uint64_t position, int amount)

uint64_t cRecPlayer::positionFromFrameNumber(uint32_t frameNumber)
{
if (!m_indexFile)
return 0;
#if VDRVERSNUM < 10703
unsigned char retFileNumber;
int retFileOffset;
Expand All @@ -278,41 +272,39 @@ uint64_t cRecPlayer::positionFromFrameNumber(uint32_t frameNumber)
int retLength;


if (!m_indexFile->Get((int)frameNumber, &retFileNumber, &retFileOffset, &retPicType, &retLength))
if (!m_indexFile.Get((int)frameNumber, &retFileNumber, &retFileOffset, &retPicType, &retLength))
return 0;

if (retFileNumber >= m_segments.Size())
if (retFileNumber >= m_segments.size())
return 0;

uint64_t position = m_segments[retFileNumber]->start + retFileOffset;
uint64_t position = m_segments[retFileNumber].start + retFileOffset;
return position;
}

uint32_t cRecPlayer::frameNumberFromPosition(uint64_t position)
{
if (!m_indexFile) return 0;

if (position >= m_totalLength)
{
DEBUGLOG("Client asked for data starting past end of recording!");
return m_totalFrames;
}

int segmentNumber = -1;
for(int i = 0; i < m_segments.Size(); i++)
{
if ((position >= m_segments[i]->start) && (position < m_segments[i]->end)) {
segmentNumber = i;
std::vector<cSegment>::iterator begin = m_segments.begin(),
end = m_segments.end(), segmentIterator = end;
for (std::vector<cSegment>::iterator i = begin; i != end; ++i) {
if ((position >= i->start) && (position < i->end)) {
segmentIterator = i;
break;
}
}

if(segmentNumber == -1) {
if (segmentIterator == end)
return m_totalFrames;
}

uint32_t askposition = position - m_segments[segmentNumber]->start;
return m_indexFile->Get((int)segmentNumber, askposition);
uint32_t askposition = position - segmentIterator->start;
int segmentNumber = std::distance(begin, segmentIterator);
return m_indexFile.Get((int)segmentNumber, askposition);
}


Expand All @@ -321,8 +313,6 @@ bool cRecPlayer::getNextIFrame(uint32_t frameNumber, uint32_t direction, uint64_
// 0 = backwards
// 1 = forwards

if (!m_indexFile) return false;

#if VDRVERSNUM < 10703
unsigned char waste1;
int waste2;
Expand All @@ -334,7 +324,7 @@ bool cRecPlayer::getNextIFrame(uint32_t frameNumber, uint32_t direction, uint64_
int iframeLength;
int indexReturnFrameNumber;

indexReturnFrameNumber = (uint32_t)m_indexFile->GetNextIFrame(frameNumber, (direction==1 ? true : false), &waste1, &waste2, &iframeLength);
indexReturnFrameNumber = (uint32_t)m_indexFile.GetNextIFrame(frameNumber, (direction==1 ? true : false), &waste1, &waste2, &iframeLength);
DEBUGLOG("GNIF input framenumber:%u, direction=%u, output:framenumber=%i, framelength=%i", frameNumber, direction, indexReturnFrameNumber, iframeLength);

if (indexReturnFrameNumber == -1) return false;
Expand Down
14 changes: 8 additions & 6 deletions recplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@

#include <stdio.h>
#include <vdr/recording.h>
#include <vdr/tools.h>

#include "config.h"

#include <vector>
#include <string>

class cSegment
{
public:
Expand Down Expand Up @@ -67,16 +69,16 @@ class cRecPlayer
char* fileNameFromIndex(int index);
void checkBufferSize(int s);

const bool m_inProgress;
const bool m_pesrecording;
char m_fileName[512];
cIndexFile *m_indexFile;
const std::string m_recordingFilename;
cIndexFile m_indexFile;
int m_file;
int m_fileOpen;
cVector<cSegment*> m_segments;
std::vector<cSegment> m_segments;
uint64_t m_totalLength;
uint32_t m_totalFrames;
char *m_recordingFilename;
bool m_pesrecording;
bool m_inProgress;
};

#endif // VNSI_RECPLAYER_H

0 comments on commit 52f511a

Please sign in to comment.