Line data Source code
1 : /*
2 : * Copyright (C) 2004-2026 Savoir-faire Linux Inc.
3 : *
4 : * This program is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 3 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * This program is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 : */
17 : #pragma once
18 :
19 : #include "audio/audio_input.h"
20 : #ifdef ENABLE_VIDEO
21 : #include "video/video_input.h"
22 : #endif
23 : #include "media_decoder.h"
24 : #include <atomic>
25 :
26 : namespace jami {
27 : class MediaPlayer
28 : {
29 : public:
30 : MediaPlayer(const std::string& resource);
31 : ~MediaPlayer();
32 :
33 : void pause(bool pause);
34 : bool isInputValid();
35 : const std::string& getId() const;
36 : void muteAudio(bool mute);
37 : bool seekToTime(int64_t time);
38 : int64_t getPlayerPosition() const;
39 : int64_t getPlayerDuration() const;
40 : bool isPaused() const;
41 0 : void setAutoRestart(bool state) { autoRestart_ = state; }
42 :
43 : private:
44 : std::string path_;
45 : bool autoRestart_ {false};
46 :
47 : // media inputs
48 : #ifdef ENABLE_VIDEO
49 : std::shared_ptr<jami::video::VideoInput> videoInput_;
50 : #endif
51 : std::shared_ptr<jami::AudioInput> audioInput_;
52 : std::shared_ptr<MediaDemuxer> demuxer_;
53 : ThreadLoop loop_;
54 :
55 : int64_t startTime_;
56 : int64_t lastPausedTime_;
57 : int64_t pauseInterval_;
58 :
59 45 : inline bool hasAudio() const { return audioStream_ >= 0; }
60 :
61 46 : inline bool hasVideo() const { return videoStream_ >= 0; }
62 :
63 : int audioStream_ = -1;
64 : int videoStream_ = -1;
65 : int64_t fileDuration_ = 0;
66 :
67 : void playFileFromBeginning();
68 : std::atomic_bool paused_ {true};
69 : bool readBufferOverflow_ = false;
70 : bool audioStreamEnded_ {false};
71 : bool videoStreamEnded_ {false};
72 :
73 : bool configureMediaInputs();
74 : void process();
75 :
76 : void emitInfo();
77 : void flushMediaBuffers();
78 :
79 : bool streamsFinished();
80 : };
81 : } // namespace jami
|