change libeplayer3 to own thread class

This commit is contained in:
smogm
2015-01-12 20:26:52 +01:00
parent 46166da4ec
commit 9ed0a0d244
8 changed files with 47 additions and 55 deletions

View File

@@ -26,9 +26,7 @@
#include <vector> #include <vector>
#include <map> #include <map>
#include <OpenThreads/ScopedLock> #include <scoped_lock.h>
#include <OpenThreads/Thread>
#include <OpenThreads/Condition>
extern "C" { extern "C" {
#include <libavutil/avutil.h> #include <libavutil/avutil.h>
@@ -48,7 +46,7 @@ class Input
friend int interrupt_cb(void *arg); friend int interrupt_cb(void *arg);
private: private:
OpenThreads::Mutex mutex; Mutex mutex;
Track *videoTrack; Track *videoTrack;
Track *audioTrack; Track *audioTrack;

View File

@@ -26,9 +26,7 @@
#include <vector> #include <vector>
#include <map> #include <map>
#include <OpenThreads/ScopedLock> #include <scoped_lock.h>
#include <OpenThreads/Thread>
#include <OpenThreads/Condition>
extern "C" { extern "C" {
#include <libavutil/avutil.h> #include <libavutil/avutil.h>
@@ -66,7 +64,7 @@ class Manager
private: private:
Player *player; Player *player;
OpenThreads::Mutex mutex; Mutex mutex;
std::map<int,Track*> videoTracks, audioTracks, subtitleTracks, teletextTracks; std::map<int,Track*> videoTracks, audioTracks, subtitleTracks, teletextTracks;
std::map<int,Program> Programs; std::map<int,Program> Programs;
void addTrack(std::map<int,Track*> &tracks, Track &track); void addTrack(std::map<int,Track*> &tracks, Track &track);

View File

@@ -26,9 +26,7 @@
#include <vector> #include <vector>
#include <map> #include <map>
#include <OpenThreads/ScopedLock> #include <scoped_lock.h>
#include <OpenThreads/Thread>
#include <OpenThreads/Condition>
extern "C" { extern "C" {
#include <libavutil/avutil.h> #include <libavutil/avutil.h>
@@ -50,7 +48,7 @@ class Output
int videofd; int videofd;
int audiofd; int audiofd;
Writer *videoWriter, *audioWriter; Writer *videoWriter, *audioWriter;
OpenThreads::Mutex audioMutex, videoMutex; Mutex audioMutex, videoMutex;
AVStream *audioStream, *videoStream; AVStream *audioStream, *videoStream;
Player *player; Player *player;
public: public:

View File

@@ -21,9 +21,7 @@
#ifndef __PLAYER_H__ #ifndef __PLAYER_H__
#define __PLAYER_H__ #define __PLAYER_H__
#include <OpenThreads/ScopedLock> #include <scoped_lock.h>
#include <OpenThreads/Thread>
#include <OpenThreads/Condition>
extern "C" { extern "C" {
#include <libavutil/avutil.h> #include <libavutil/avutil.h>
@@ -63,7 +61,7 @@ class Player {
Input input; Input input;
Output output; Output output;
Manager manager; Manager manager;
OpenThreads::Mutex chapterMutex; Mutex chapterMutex;
std::vector<Chapter> chapters; std::vector<Chapter> chapters;
pthread_t playThread; pthread_t playThread;

View File

@@ -280,17 +280,17 @@ static int lock_callback(void **mutex, enum AVLockOp op)
{ {
switch (op) { switch (op) {
case AV_LOCK_CREATE: case AV_LOCK_CREATE:
*mutex = (void *) new OpenThreads::Mutex; *mutex = (void *) new Mutex;
return !*mutex; return !*mutex;
case AV_LOCK_DESTROY: case AV_LOCK_DESTROY:
delete static_cast<OpenThreads::Mutex *>(*mutex); delete static_cast<Mutex *>(*mutex);
*mutex = NULL; *mutex = NULL;
return 0; return 0;
case AV_LOCK_OBTAIN: case AV_LOCK_OBTAIN:
static_cast<OpenThreads::Mutex *>(*mutex)->lock(); static_cast<Mutex *>(*mutex)->lock();
return 0; return 0;
case AV_LOCK_RELEASE: case AV_LOCK_RELEASE:
static_cast<OpenThreads::Mutex *>(*mutex)->unlock(); static_cast<Mutex *>(*mutex)->unlock();
return 0; return 0;
default: default:
return -1; return -1;
@@ -589,7 +589,7 @@ bool Input::Stop()
usleep(100000); usleep(100000);
if (avfc) { if (avfc) {
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mutex); ScopedLock lock(mutex);
for (unsigned int i = 0; i < avfc->nb_streams; i++) for (unsigned int i = 0; i < avfc->nb_streams; i++)
avcodec_close(avfc->streams[i]->codec); avcodec_close(avfc->streams[i]->codec);
avformat_close_input(&avfc); avformat_close_input(&avfc);

View File

@@ -25,7 +25,7 @@
void Manager::addTrack(std::map<int,Track*> &tracks, Track &track) void Manager::addTrack(std::map<int,Track*> &tracks, Track &track)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); ScopedLock m_lock(mutex);
std::map<int,Track*>::iterator it = tracks.find(track.pid); std::map<int,Track*>::iterator it = tracks.find(track.pid);
if (it == tracks.end()) { if (it == tracks.end()) {
Track *t = new Track; Track *t = new Track;
@@ -59,7 +59,7 @@ std::vector<Track> Manager::getTracks(std::map<int,Track*> &tracks)
{ {
player->input.UpdateTracks(); player->input.UpdateTracks();
std::vector<Track> res; std::vector<Track> res;
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); ScopedLock m_lock(mutex);
for(std::map<int,Track*>::iterator it = tracks.begin(); it != tracks.end(); ++it) for(std::map<int,Track*>::iterator it = tracks.begin(); it != tracks.end(); ++it)
if (!it->second->inactive && !it->second->hidden) if (!it->second->inactive && !it->second->hidden)
res.push_back(*it->second); res.push_back(*it->second);
@@ -88,7 +88,7 @@ std::vector<Track> Manager::getTeletextTracks()
Track *Manager::getTrack(std::map<int,Track*> &tracks, int pid) Track *Manager::getTrack(std::map<int,Track*> &tracks, int pid)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); ScopedLock m_lock(mutex);
std::map<int,Track*>::iterator it = tracks.find(pid); std::map<int,Track*>::iterator it = tracks.find(pid);
if (it != tracks.end() && !it->second->inactive) if (it != tracks.end() && !it->second->inactive)
return it->second; return it->second;
@@ -116,7 +116,7 @@ Track *Manager::getTeletextTrack(int pid)
bool Manager::initTrackUpdate() bool Manager::initTrackUpdate()
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); ScopedLock m_lock(mutex);
for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it) for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it)
it->second->inactive = !it->second->is_static; it->second->inactive = !it->second->is_static;
@@ -140,7 +140,7 @@ void Manager::addProgram(Program &program)
std::vector<Program> Manager::getPrograms(void) std::vector<Program> Manager::getPrograms(void)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); ScopedLock m_lock(mutex);
std::vector<Program> res; std::vector<Program> res;
for (std::map<int,Program>::iterator it = Programs.begin(); it != Programs.end(); ++it) for (std::map<int,Program>::iterator it = Programs.begin(); it != Programs.end(); ++it)
res.push_back(it->second); res.push_back(it->second);
@@ -149,7 +149,7 @@ std::vector<Program> Manager::getPrograms(void)
bool Manager::selectProgram(const int id) bool Manager::selectProgram(const int id)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); ScopedLock m_lock(mutex);
std::map<int,Program>::iterator i = Programs.find(id); std::map<int,Program>::iterator i = Programs.find(id);
if (i != Programs.end()) { if (i != Programs.end()) {
@@ -236,7 +236,7 @@ bool Manager::selectProgram(const int id)
void Manager::clearTracks() void Manager::clearTracks()
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(mutex); ScopedLock m_lock(mutex);
for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it) for (std::map<int,Track*>::iterator it = audioTracks.begin(); it != audioTracks.end(); ++it)
delete it->second; delete it->second;

View File

@@ -66,8 +66,8 @@ Output::~Output()
bool Output::Open() bool Output::Open()
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
if (videofd < 0) if (videofd < 0)
videofd = open(VIDEODEV, O_RDWR); videofd = open(VIDEODEV, O_RDWR);
@@ -100,8 +100,8 @@ bool Output::Close()
{ {
Stop(); Stop();
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
if (videofd > -1) { if (videofd > -1) {
close(videofd); close(videofd);
@@ -122,8 +122,8 @@ bool Output::Play()
{ {
bool ret = true; bool ret = true;
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
AVCodecContext *avcc; AVCodecContext *avcc;
@@ -149,8 +149,8 @@ bool Output::Stop()
{ {
bool ret = true; bool ret = true;
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
if (videofd > -1) { if (videofd > -1) {
ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL); ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
@@ -175,8 +175,8 @@ bool Output::Pause()
{ {
bool ret = true; bool ret = true;
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
if (videofd > -1) { if (videofd > -1) {
if (dioctl(videofd, VIDEO_FREEZE, NULL)) if (dioctl(videofd, VIDEO_FREEZE, NULL))
@@ -195,8 +195,8 @@ bool Output::Continue()
{ {
bool ret = true; bool ret = true;
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
if (videofd > -1 && dioctl(videofd, VIDEO_CONTINUE, NULL)) if (videofd > -1 && dioctl(videofd, VIDEO_CONTINUE, NULL))
ret = false; ret = false;
@@ -209,7 +209,7 @@ bool Output::Continue()
bool Output::Mute(bool b) bool Output::Mute(bool b)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
//AUDIO_SET_MUTE has no effect with new player //AUDIO_SET_MUTE has no effect with new player
return audiofd > -1 && !dioctl(audiofd, b ? AUDIO_STOP : AUDIO_PLAY, NULL); return audiofd > -1 && !dioctl(audiofd, b ? AUDIO_STOP : AUDIO_PLAY, NULL);
} }
@@ -219,8 +219,8 @@ bool Output::Flush()
{ {
bool ret = true; bool ret = true;
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL)) if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL))
ret = false; ret = false;
@@ -241,31 +241,31 @@ bool Output::Flush()
bool Output::FastForward(int speed) bool Output::FastForward(int speed)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
return videofd > -1 && !dioctl(videofd, VIDEO_FAST_FORWARD, speed); return videofd > -1 && !dioctl(videofd, VIDEO_FAST_FORWARD, speed);
} }
bool Output::SlowMotion(int speed) bool Output::SlowMotion(int speed)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
return videofd > -1 && !dioctl(videofd, VIDEO_SLOWMOTION, speed); return videofd > -1 && !dioctl(videofd, VIDEO_SLOWMOTION, speed);
} }
bool Output::AVSync(bool b) bool Output::AVSync(bool b)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
return audiofd > -1 && !dioctl(audiofd, AUDIO_SET_AV_SYNC, b); return audiofd > -1 && !dioctl(audiofd, AUDIO_SET_AV_SYNC, b);
} }
bool Output::ClearAudio() bool Output::ClearAudio()
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
return audiofd > -1 && !ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL); return audiofd > -1 && !ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL);
} }
bool Output::ClearVideo() bool Output::ClearVideo()
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
return videofd > -1 && !ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL); return videofd > -1 && !ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL);
} }
@@ -297,7 +297,7 @@ bool Output::GetFrameCount(int64_t &framecount)
bool Output::SwitchAudio(AVStream *stream) bool Output::SwitchAudio(AVStream *stream)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
if (stream == audioStream) if (stream == audioStream)
return true; return true;
if (audiofd > -1) { if (audiofd > -1) {
@@ -321,7 +321,7 @@ bool Output::SwitchAudio(AVStream *stream)
bool Output::SwitchVideo(AVStream *stream) bool Output::SwitchVideo(AVStream *stream)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
if (stream == videoStream) if (stream == videoStream)
return true; return true;
if (videofd > -1) { if (videofd > -1) {
@@ -347,11 +347,11 @@ bool Output::Write(AVStream *stream, AVPacket *packet, int64_t pts)
{ {
switch (stream->codec->codec_type) { switch (stream->codec->codec_type) {
case AVMEDIA_TYPE_VIDEO: { case AVMEDIA_TYPE_VIDEO: {
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex); ScopedLock v_lock(videoMutex);
return videofd > -1 && videoWriter && videoWriter->Write(packet, pts); return videofd > -1 && videoWriter && videoWriter->Write(packet, pts);
} }
case AVMEDIA_TYPE_AUDIO: { case AVMEDIA_TYPE_AUDIO: {
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex); ScopedLock a_lock(audioMutex);
return audiofd > -1 && audioWriter && audioWriter->Write(packet, pts); return audiofd > -1 && audioWriter && audioWriter->Write(packet, pts);
} }
default: default:

View File

@@ -370,7 +370,7 @@ bool Player::GetChapters(std::vector<int> &positions, std::vector<std::string> &
positions.clear(); positions.clear();
titles.clear(); titles.clear();
input.UpdateTracks(); input.UpdateTracks();
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(chapterMutex); ScopedLock m_lock(chapterMutex);
for (std::vector<Chapter>::iterator it = chapters.begin(); it != chapters.end(); ++it) { for (std::vector<Chapter>::iterator it = chapters.begin(); it != chapters.end(); ++it) {
positions.push_back(it->start/1000); positions.push_back(it->start/1000);
titles.push_back(it->title); titles.push_back(it->title);
@@ -380,7 +380,7 @@ bool Player::GetChapters(std::vector<int> &positions, std::vector<std::string> &
void Player::SetChapters(std::vector<Chapter> &Chapters) void Player::SetChapters(std::vector<Chapter> &Chapters)
{ {
OpenThreads::ScopedLock<OpenThreads::Mutex> m_lock(chapterMutex); ScopedLock m_lock(chapterMutex);
chapters = Chapters; chapters = Chapters;
} }