Skip to content

Commit c6dcbdb

Browse files
committed
Refactor the findings to hide the list and merge on timestamp
Realigned results to video frames
1 parent 04e43ed commit c6dcbdb

File tree

12 files changed

+209
-129
lines changed

12 files changed

+209
-129
lines changed

mythtv/programs/mythgpucommflag/audioconsumer.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ AudioConsumer::AudioConsumer(PacketQueue *inQ, ResultsMap *outMap,
2727

2828
m_context = avcodec_alloc_context();
2929
}
30+
31+
AudioConsumer::~AudioConsumer()
32+
{
33+
av_free(m_audioSamples);
34+
if (m_dev)
35+
delete m_dev;
36+
};
3037

3138
void AudioConsumer::ProcessPacket(Packet *packet)
3239
{
@@ -137,19 +144,19 @@ void AudioConsumer::ProcessFrame(int16_t *samples, int size, int frames,
137144
AudioProcessor *proc = *it;
138145

139146
// Run the routine in GPU/CPU & pull results
140-
FlagResults *result = proc->m_func(m_dev, samples, size, frames, pts,
141-
rate);
147+
FlagFindings *findings = proc->m_func(m_dev, samples, size, frames, pts,
148+
rate);
142149

143150
// Toss the results onto the results list
144-
if (result)
151+
if (findings)
145152
{
146153
static const AVRational realTimeBase = { 1, 1000 };
147154
LOG(VB_GENERAL, LOG_INFO, "Audio Finding found");
148155
pts = av_rescale_q(pts, realTimeBase, m_timebase);
149-
result->m_timestamp = NormalizeTimecode(pts);;
150-
result->m_duration = duration;
151-
LOG(VB_GENERAL, LOG_INFO, result->toString());
152-
m_outMap->insertMulti(result->m_timestamp, result);
156+
int64_t timestamp = NormalizeTimecode(pts);
157+
FlagResults *result = FlagResults::Create(m_outMap, timestamp);
158+
findings->SetTiming(timestamp, duration, duration, 0);
159+
result->append(findings);
153160
}
154161
}
155162

mythtv/programs/mythgpucommflag/audioconsumer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class AudioConsumer : public QueueConsumer
1212
{
1313
public:
1414
AudioConsumer(PacketQueue *inQ, ResultsMap *outMap, OpenCLDevice *dev);
15-
~AudioConsumer() { av_free(m_audioSamples); };
15+
~AudioConsumer();
1616
bool Initialize(void) { return true; };
1717
void ProcessPacket(Packet *packet);
1818
void ProcessFrame(int16_t *samples, int size, int frames, int64_t pts,

mythtv/programs/mythgpucommflag/audioprocessor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
#include "openclinterface.h"
88
#include "flagresults.h"
99

10-
typedef FlagResults *(*AudioProcessorFunc)(OpenCLDevice *, int16_t *, int, int,
11-
int64_t, int);
10+
typedef FlagFindings *(*AudioProcessorFunc)(OpenCLDevice *, int16_t *, int, int,
11+
int64_t, int);
1212

1313
typedef struct {
1414
QString name;

mythtv/programs/mythgpucommflag/flagresults.cpp

Lines changed: 109 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
#include "flagresults.h"
66
#include "mythlogging.h"
77

8+
#ifndef MIN
9+
#define MIN(x,y) ((x) < (y) ? (x) : (y))
10+
#endif
11+
812
FlagFindingsMap findingsMap;
913

1014
void findingsAdd(int value, QString description);
@@ -29,40 +33,77 @@ QString FlagFindings::toString(void)
2933
if (findingsMap.contains((int)m_type))
3034
finding = findingsMap.value((int)m_type);
3135

32-
QString str = QString("%1: %2").arg(finding).arg(m_value);
36+
QString str =
37+
QString("Findings: Frame: %1, Offset: %2.%3, Duration: %4.%5\n")
38+
.arg(m_timestamp)
39+
.arg(m_offset / 1000000)
40+
.arg((int)(m_offset % 1000000), 6, 10, QChar('0'))
41+
.arg(m_duration / 1000000)
42+
.arg((int)(m_duration % 1000000), 6, 10, QChar('0'));
43+
44+
str += QString(" %1: %2").arg(finding).arg(m_value);
3345
return str;
3446
}
3547

36-
QString FlagResults::toString(void)
48+
QString FlagFindings::toGnuplot(void)
3749
{
38-
FlagFindingsList::iterator it;
50+
int64_t timestamp = m_timestamp * m_frameDuration + m_offset;
51+
QString str = QString("%1 %2 %3") .arg((double)(timestamp) / 1000000.0)
52+
.arg((double)(timestamp + m_duration - 1) / 1000000.0)
53+
.arg(m_type + 1);
54+
return str;
55+
}
3956

40-
QString str = QString("Findings at PTS: %1, Duration: %2\n")
41-
.arg(m_timestamp) .arg(m_duration);
57+
void FlagFindings::SetTiming(int64_t timestamp, int duration, int frameDuration,
58+
int offset)
59+
{
60+
m_timestamp = timestamp;
61+
m_duration = duration;
62+
m_frameDuration = frameDuration;
63+
m_offset = offset;
64+
}
4265

43-
for (it = m_findings->begin(); it != m_findings->end(); ++it)
66+
QString FlagResults::toString(void)
67+
{
68+
FlagResults::iterator it;
69+
QString str("");
70+
71+
for (it = begin(); it != end(); ++it)
4472
{
4573
FlagFindings *finding = *it;
46-
str += QString(" %1\n").arg(finding->toString());
74+
str += QString("%1\n").arg(finding->toString());
4775
}
4876
str += QString("\n");
4977
return str;
5078
}
5179

5280
QString FlagResults::toGnuplot(void)
5381
{
54-
FlagFindingsList::iterator it;
82+
FlagResults::iterator it;
5583
QString str("");
5684

57-
for (it = m_findings->begin(); it != m_findings->end(); ++it)
85+
for (it = begin(); it != end(); ++it)
5886
{
5987
FlagFindings *finding = *it;
60-
str += QString("%1 %2 %3\n") .arg(m_timestamp)
61-
.arg(m_timestamp + m_duration - 1) .arg(finding->m_type + 1);
88+
str += QString("%1\n") .arg(finding->toGnuplot());
6289
}
6390
return str;
6491
}
6592

93+
FlagResults *FlagResults::Create(ResultsMap *map, int64_t timestamp)
94+
{
95+
FlagResults *results;
96+
if (map->contains(timestamp))
97+
results = map->value(timestamp);
98+
else
99+
{
100+
results = new FlagResults;
101+
map->insertMulti(timestamp, results);
102+
}
103+
104+
return results;
105+
}
106+
66107
QString ResultsMap::toString(QString title)
67108
{
68109
ResultsMap::iterator it;
@@ -88,6 +129,63 @@ QString ResultsMap::toGnuplot(void)
88129
}
89130
return str;
90131
}
132+
133+
ResultsMap *ResultsMap::Compress(int frameDuration)
134+
{
135+
if (frameDuration == 0)
136+
return NULL;
137+
138+
ResultsMap *newMap = new ResultsMap;
139+
ResultsMap::iterator it;
140+
for (it = begin(); it != end(); ++it)
141+
{
142+
FlagResults *oldResults = it.value();
143+
FlagResults::iterator it2 = oldResults->begin();
144+
if (it2 == oldResults->end())
145+
continue;
146+
147+
FlagFindings *oldFinding = *it2;
148+
149+
int remainDuration = oldFinding->m_duration;
150+
int64_t timestamp = oldFinding->m_timestamp / frameDuration;
151+
int offset = oldFinding->m_timestamp - (timestamp * frameDuration);
152+
int duration = MIN(remainDuration, frameDuration - offset);
153+
154+
do {
155+
for (it2 = oldResults->begin(); it2 != oldResults->end(); ++it2)
156+
{
157+
FlagResults *results = FlagResults::Create(newMap, timestamp);
158+
oldFinding = *it2;
159+
160+
FlagFindings *finding = new FlagFindings(oldFinding);
161+
finding->SetTiming(timestamp, duration, frameDuration, offset);
162+
results->append(finding);
163+
}
164+
165+
remainDuration -= duration;
166+
duration = MIN(frameDuration, remainDuration);
167+
offset = 0;
168+
timestamp++;
169+
} while (remainDuration);
170+
}
171+
return newMap;
172+
}
173+
174+
int64_t ResultsMap::GetDuration(void)
175+
{
176+
ResultsMap::iterator it = begin();
177+
if (it == end())
178+
return 0;
179+
180+
FlagResults *results = it.value();
181+
FlagResults::iterator it2 = results->begin();
182+
if (it2 == results->end())
183+
return 0;
184+
185+
FlagFindings *finding = *it2;
186+
return finding->m_frameDuration;
187+
}
188+
91189
/*
92190
* vim:ts=4:sw=4:ai:et:si:sts=4
93191
*/

mythtv/programs/mythgpucommflag/flagresults.h

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,43 @@ class FlagFindings
1414
{
1515
public:
1616
FlagFindings(int type, int64_t value) : m_type(type), m_value(value) {};
17+
FlagFindings(FlagFindings *other) : m_type(other->m_type),
18+
m_value(other->m_value), m_offset(other->m_offset) {};
1719
~FlagFindings() {};
1820
QString toString(void);
21+
QString toGnuplot(void);
22+
void SetTiming(int64_t timestamp, int duration, int frameDuration,
23+
int offset = 0);
1924

20-
int m_type;
25+
int m_type;
2126
int64_t m_value;
22-
};
2327

24-
typedef QList<FlagFindings *> FlagFindingsList;
28+
int64_t m_timestamp;
29+
int m_duration;
30+
int m_frameDuration;
31+
int m_offset; // Offset within video frame
32+
};
2533

26-
class FlagResults
34+
class ResultsMap;
35+
class FlagResults : public QList<FlagFindings *>
2736
{
2837
public:
29-
FlagResults(AVPacket *pkt, FlagFindingsList *list) : m_findings(list)
30-
{
31-
m_valid = (pkt != NULL);
32-
}
38+
FlagResults() {};
39+
~FlagResults() {};
40+
41+
static FlagResults *Create(ResultsMap *map, int64_t timestamp);
3342

34-
FlagResults(FlagFindingsList *list) : m_findings(list) {};
35-
~FlagResults() { delete m_findings; };
3643
QString toString(void);
3744
QString toGnuplot(void);
38-
39-
bool m_valid;
40-
int64_t m_timestamp;
41-
int m_duration;
42-
43-
FlagFindingsList *m_findings;
4445
};
4546

4647
class ResultsMap : public QMap<int64_t, FlagResults *>
4748
{
4849
public:
4950
QString toString(QString title);
5051
QString toGnuplot(void);
52+
ResultsMap *Compress(int frameDuration);
53+
int64_t GetDuration(void);
5154
};
5255

5356
typedef QMap<int, QString> FlagFindingsMap;

mythtv/programs/mythgpucommflag/main.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,6 @@ static bool DoesFileExist(ProgramInfo *program_info)
114114

115115
int main(int argc, char **argv)
116116
{
117-
#if 0
118-
setenv("__GL_NO_DSO_FINALIZER", "1", true);
119-
#endif
120-
121117
// Parse commandline
122118
if (!cmdline.Parse(argc, argv))
123119
{
@@ -345,21 +341,20 @@ int main(int argc, char **argv)
345341
delete ctx;
346342
delete audioThread;
347343
delete videoThread;
348-
delete devices[0];
349-
delete devices[1];
350344

351345
LOG(VB_GENERAL, LOG_INFO, QString("audioMarks: %1, videoMarks: %2")
352346
.arg(audioMarks.size()) .arg(videoMarks.size()));
353347

354348
// Combine results maps into one map
355-
ResultsMap findings(audioMarks);
356-
findings.unite(videoMarks);
349+
ResultsMap mergedMarks(audioMarks);
350+
mergedMarks.unite(videoMarks);
351+
ResultsMap *findings = mergedMarks.Compress(videoMarks.GetDuration());
357352

358353
// Dump results to an output file
359354
QString audioDump = audioMarks.toString("Audio markings");
360355
QString videoDump = videoMarks.toString("Video markings");
361-
QString mergedDump = findings.toString("Merged markings");
362-
QString mergedPlot = findings.toGnuplot();
356+
QString mergedDump = findings->toString("Merged markings");
357+
QString mergedPlot = findings->toGnuplot();
363358

364359
QFile dump("out/results");
365360
dump.open(QIODevice::WriteOnly);
@@ -383,9 +378,7 @@ int main(int argc, char **argv)
383378

384379
// Send map to the db
385380

386-
#if 0
387-
unsetenv("__GL_NO_DSO_FINALIZER");
388-
#endif
381+
delete findings;
389382
return(GENERIC_EXIT_OK);
390383
}
391384

mythtv/programs/mythgpucommflag/openclaudioprocessor.cpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313

1414
// Prototypes
1515
void OpenCLVolumeLevelCleanup(cl_mem **bufs);
16-
FlagResults *OpenCLVolumeLevel(OpenCLDevice *dev, int16_t *samples, int size,
17-
int count, int64_t pts, int rate);
16+
FlagFindings *OpenCLVolumeLevel(OpenCLDevice *dev, int16_t *samples, int size,
17+
int count, int64_t pts, int rate);
1818

1919
AudioProcessorList *openCLAudioProcessorList;
2020

@@ -32,8 +32,8 @@ void InitOpenCLAudioProcessors(void)
3232

3333
#define KERNEL_VOLUME_CL "audioVolumeLevel.cl"
3434
#define KERNEL_VOLUME_64_CL "audioVolumeLevel64.cl"
35-
FlagResults *OpenCLVolumeLevel(OpenCLDevice *dev, int16_t *samples, int size,
36-
int count, int64_t pts, int rate)
35+
FlagFindings *OpenCLVolumeLevel(OpenCLDevice *dev, int16_t *samples, int size,
36+
int count, int64_t pts, int rate)
3737
{
3838
LOG(VB_GPUAUDIO, LOG_INFO, "OpenCL Volume Level");
3939

@@ -306,21 +306,14 @@ FlagResults *OpenCLVolumeLevel(OpenCLDevice *dev, int16_t *samples, int size,
306306
.arg(intStats[2]) .arg(intStats[3]));
307307
#endif
308308

309-
FlagFindings *finding = NULL;
309+
FlagFindings *findings = NULL;
310310

311311
if (deltaRMSdB >= 6.0)
312-
finding = new FlagFindings(kFindingAudioHigh, true);
312+
findings = new FlagFindings(kFindingAudioHigh, true);
313313
else if (deltaRMSdB <= -12.0)
314-
finding = new FlagFindings(kFindingAudioLow, true);
314+
findings = new FlagFindings(kFindingAudioLow, true);
315315

316-
if (!finding)
317-
return NULL;
318-
319-
FlagFindingsList *findings = new FlagFindingsList();
320-
findings->append(finding);
321-
FlagResults *results = new FlagResults(findings);
322-
323-
return results;
316+
return findings;
324317
}
325318

326319

0 commit comments

Comments
 (0)