J5_2

Форк
0
/
detector.cpp 
108 строк · 2.8 Кб
1
#include <cstdint>
2
#include <cstdlib>
3
#include <iostream>
4

5
#include "math.h"
6
#include "ffmpeg.h"
7

8
int main(int argc, char** argv)
9
{
10
	if (argc < 2)
11
	{
12
		std::cerr << "You must specify SOURCE\n";
13
		return 0;
14
	}
15

16
    int n = 12;
17
    if (argc > 2)
18
        n = atoi(argv[2]);
19
    std::cout << "[Detector] N = " << n << std::endl;
20

21
    float k = 3.0f;
22
    if (argc > 3)
23
        k = atof(argv[3]);
24
    std::cout << "[Detector] K = " << k << std::endl;
25

26
    // HACK
27
    // int gopSize = 12;
28
    // if (argc > 4)
29
    //     gopSize = atoi(argv[4]);
30
    // std::cout << "GOP = " << gopSize << std::endl;
31

32
	std::string source(argv[1]);
33
	std::cout << "[Detector] Start processing \"" << source.c_str() << "\"" << std::endl;
34

35
    auto kB = [](int B) { return static_cast<float>(B) / 1024.0f; };
36
    auto isKeyFrame = [](int flags) { return flags & AV_PKT_FLAG_KEY; };
37

38
	FFmpegH264Demuxer demuxer(source.c_str());
39
    StatsCollector collector(n);
40
    EventTrigger trigger(1, 8);
41

42
    uint8_t* pktData{nullptr};
43
    int pktSize = 0;
44
    int64_t pktPts = 0;
45
    int pktFlags = 0;
46
    uint64_t fno = 0;
47
    uint64_t IFrames = 0;
48
    int nEvents = 0;
49
    uint64_t firstKeyFrame = 0;
50
    do
51
    {
52
        demuxer.Demux(&pktData, &pktSize, &pktPts, &pktFlags);
53
        if (!isKeyFrame(pktFlags))
54
        {
55
            ++fno;
56
            continue;
57
        }
58

59
        // Способ 2. HACK.
60
        
61
        // if (0 == firstKeyFrame)
62
        // {
63
        //     if (isKeyFrame(pktFlags))
64
        //     {
65
        //         firstKeyFrame = fno;
66
        //     }
67
        //     else
68
        //     {
69
        //         ++fno;
70
        //         continue;
71
        //     }
72
        // }
73
        // bool isKeyFrame2 = ((fno - firstKeyFrame) % gopSize == 0);
74
        // if (!isKeyFrame2)
75
        // {
76
        //     ++fno;
77
        //     continue;
78
        // }
79

80
        const auto kBytes = kB(pktSize);
81

82
        if (IFrames > static_cast<uint64_t>(n/2))
83
        {
84
            const int state = trigger.update( collector.outlier(kBytes, k) );
85
            if (EventTrigger::ABOUT_TO_ON == state)
86
            {
87
                ++nEvents;
88
                int min = floor(pktPts / 1000.0 / 60.0);
89
                int sec = floor(pktPts / 1000.0) - 60.0*min;
90
                std::cout << "[Detector] EVENT! Outlier at " 
91
                          << pktPts 
92
                          << " | frame #" << IFrames 
93
                          << " | " << min << ":" << sec
94
                          << std::endl;
95
            }
96
        }
97

98
        collector.collect(kBytes);
99
        ++fno;
100
        ++IFrames;
101
    } while (pktSize);
102
    std::cout << "[Detector] Processed " << fno << " packets" << std::endl;
103
    std::cout << "[Detector] Processed " << IFrames << " I-frames" << std::endl;
104
    std::cout << "[Detector] Caught " << nEvents << " events" << std::endl;
105

106
	std::cout << "[Detector] Processing finished\n";
107
	return 0;
108
}
109

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.