17 using namespace commDetector2;
18 using namespace frameAnalyzer;
23 scenechange_data_sort_desc_frequency(
const void *aa,
const void *bb)
31 return freqdiff ? freqdiff : sc1->
color - sc2->
color;
38 unsigned int ncolors =
sizeof(*hh)/
sizeof((*hh)[0]);
40 for (
unsigned int ii = 0; ii < ncolors; ii++)
42 (*scdata)[ii].color = ii;
43 (*scdata)[ii].frequency = (*hh)[ii];
45 qsort(*scdata,
sizeof(*scdata)/
sizeof((*scdata)[0]),
sizeof((*scdata)[0]),
46 scenechange_data_sort_desc_frequency);
57 unsigned short diff = 0;
58 for (
unsigned int ii = 0; ii <
sizeof(*sc1)/
sizeof((*sc1)[0]); ii++)
59 diff += abs((*sc1)[ii].frequency - (*sc2)[ii].frequency) +
60 abs((*sc1)[ii].color - (*sc2)[ii].color);
65 writeData(QString filename,
const unsigned short *
scdiff,
long long nframes)
70 QByteArray fname = filename.toLocal8Bit();
71 if (!(fp = fopen(fname.constData(),
"w")))
73 for (frameno = 0; frameno < nframes; frameno++)
74 (
void)fprintf(fp,
"%5u\n", scdiff[frameno]);
76 LOG(VB_COMMFLAG, LOG_ERR, QString(
"Error closing %1: %2")
77 .arg(filename).arg(strerror(errno)));
83 const unsigned short *scdiff,
unsigned short mindiff)
91 for (frameno = 0; frameno < nframes; frameno++)
93 if (scdiff[frameno] > mindiff)
94 changeMap->insert(frameno, 0);
108 ,
debugdata(debugdir +
"/SceneChangeDetector.txt")
112 LOG(VB_COMMFLAG, LOG_INFO,
"SceneChangeDetector");
124 QString(
"SceneChangeDetector debugLevel %1").arg(
debugLevel));
147 memset(scdata, 0, nframes *
sizeof(*scdata));
149 scdiff =
new unsigned short[nframes];
150 memset(scdiff, 0, nframes *
sizeof(*scdiff));
154 LOG(VB_COMMFLAG, LOG_INFO,
155 QString(
"SceneChangeDetector::MythPlayerInited %1x%2")
156 .arg(video_disp_dim.width())
157 .arg(video_disp_dim.height()));
164 long long *pNextFrame)
172 LOG(VB_COMMFLAG, LOG_ERR,
173 QString(
"SceneChangeDetector::analyzeFrame error at frame %1")
184 LOG(VB_COMMFLAG, LOG_INFO, QString(
"SceneChangeDetector::finished(%1)")
189 for (
unsigned int frameno = 0; frameno < nframes; frameno++)
190 (
void)scenechange_data_init(&scdata[frameno], &histogram[frameno]);
192 for (
unsigned int frameno = 1; frameno < nframes; frameno++)
193 scdiff[frameno] = scenechange_data_diff(&scdata[frameno - 1],
198 if (
final && writeData(
debugdata, scdiff, nframes))
200 LOG(VB_COMMFLAG, LOG_INFO,
201 QString(
"SceneChangeDetector::finished wrote %1")
208 unsigned short *scdiffsort =
new unsigned short[nframes];
209 memcpy(scdiffsort, scdiff, nframes *
sizeof(*scdiff));
211 (
int)(0.979472 * nframes));
212 LOG(VB_COMMFLAG, LOG_INFO,
213 QString(
"SceneChangeDetector::finished applying threshold value %1")
215 computeChangeMap(&changeMap, nframes, scdiff, mindiff);