libeplayer3: extend API

This commit is contained in:
martii
2014-04-09 22:06:41 +02:00
parent eafc00a861
commit 6c340eb752
6 changed files with 61 additions and 24 deletions

View File

@@ -4,8 +4,8 @@ AM_CPPFLAGS = -I$(srcdir)/include
AM_CPPFLAGS += -Wall AM_CPPFLAGS += -Wall
AM_CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE AM_CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
AM_CPPFLAGS += -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS AM_CPPFLAGS += -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
AM_CPPFLAGS += -fno-rtti #AM_CPPFLAGS += -fno-rtti
#AM_CPPFLAGS += -ggdb AM_CPPFLAGS += -ggdb
libeplayer3_la_SOURCES = \ libeplayer3_la_SOURCES = \
input.cpp output.cpp manager.cpp player.cpp \ input.cpp output.cpp manager.cpp player.cpp \

View File

@@ -56,7 +56,6 @@ class Input
float seek_sec_abs; float seek_sec_abs;
float seek_sec_rel; float seek_sec_rel;
bool isContainerRunning; bool isContainerRunning;
bool terminating;
bool abortPlayback; bool abortPlayback;
Player *player; Player *player;

View File

@@ -90,6 +90,11 @@ class Player {
bool SwitchTeletext(int pid); bool SwitchTeletext(int pid);
bool SwitchSubtitle(int pid); bool SwitchSubtitle(int pid);
int GetAudioPid();
int GetVideoPid();
int GetSubtitlePid();
int GetTeletextPid();
bool GetPts(int64_t &pts); bool GetPts(int64_t &pts);
bool GetFrameCount(int64_t &framecount); bool GetFrameCount(int64_t &framecount);
bool GetDuration(double &duration); bool GetDuration(double &duration);
@@ -98,6 +103,7 @@ class Player {
bool SlowMotion(int repeats); bool SlowMotion(int repeats);
bool FastBackward(int speed); bool FastBackward(int speed);
bool FastForward(int speed); bool FastForward(int speed);
bool Open(const char *Url, bool noprobe = false); bool Open(const char *Url, bool noprobe = false);
bool Close(); bool Close();
bool Play(); bool Play();

View File

@@ -49,7 +49,7 @@ Input::Input()
hasPlayThreadStarted = 0; hasPlayThreadStarted = 0;
seek_sec_abs = -1.0; seek_sec_abs = -1.0;
seek_sec_rel = 0.0; seek_sec_rel = 0.0;
terminating = false; abortPlayback = false;
} }
Input::~Input() Input::~Input()
@@ -377,8 +377,6 @@ bool Input::Init(const char *filename)
return false; return false;
} }
terminating = false;
bool res = UpdateTracks(); bool res = UpdateTracks();
if (!videoTrack && !audioTrack) { if (!videoTrack && !audioTrack) {
@@ -398,19 +396,15 @@ bool Input::Init(const char *filename)
bool Input::UpdateTracks() bool Input::UpdateTracks()
{ {
if (terminating) if (abortPlayback)
return true; return true;
std::vector<Chapter> chapters; std::vector<Chapter> chapters;
for (unsigned int i = 0; i < avfc->nb_chapters; i++) { for (unsigned int i = 0; i < avfc->nb_chapters; i++) {
AVDictionaryEntry *title = av_dict_get(avfc->metadata, "title", NULL, 0);
if (!title)
continue;
AVChapter *ch = avfc->chapters[i]; AVChapter *ch = avfc->chapters[i];
if (!ch) AVDictionaryEntry* title = av_dict_get(ch->metadata, "title", NULL, 0);
continue;
Chapter chapter; Chapter chapter;
chapter.title = title ? title->value : "?"; chapter.title = title ? title->value : "";
chapter.start = (double) ch->start * av_q2d(ch->time_base) * 1000.0; chapter.start = (double) ch->start * av_q2d(ch->time_base) * 1000.0;
chapter.end = (double) ch->end * av_q2d(ch->time_base) * 1000.0; chapter.end = (double) ch->end * av_q2d(ch->time_base) * 1000.0;
chapters.push_back(chapter); chapters.push_back(chapter);
@@ -496,8 +490,9 @@ bool Input::UpdateTracks()
stream->codec->codec = avcodec_find_decoder(stream->codec->codec_id); stream->codec->codec = avcodec_find_decoder(stream->codec->codec_id);
if (!stream->codec->codec) if (!stream->codec->codec)
fprintf(stderr, "avcodec_find_decoder failed for subtitle track %d\n", n); fprintf(stderr, "avcodec_find_decoder failed for subtitle track %d\n", n);
else if (avcodec_open2(stream->codec, stream->codec->codec, NULL)) { else {
fprintf(stderr, "avcodec_open2 failed for subtitle track %d\n", n); int err = avcodec_open2(stream->codec, stream->codec->codec, NULL);
if (averror(err, avcodec_open2))
stream->codec->codec = NULL; stream->codec->codec = NULL;
} }
} }
@@ -522,8 +517,6 @@ bool Input::Stop()
while (hasPlayThreadStarted != 0) while (hasPlayThreadStarted != 0)
usleep(100000); usleep(100000);
terminating = true;
if (avfc) if (avfc)
avformat_close_input(&avfc); avformat_close_input(&avfc);

View File

@@ -38,6 +38,13 @@ Player::Player()
output.player = this; output.player = this;
manager.player = this; manager.player = this;
hasThreadStarted = false; hasThreadStarted = false;
isPaused = false;
isPlaying = false;
isForwarding = false;
isBackWard = false;
isSlowMotion = false;
Speed = 0;
} }
void *Player::playthread(void *arg) void *Player::playthread(void *arg)
@@ -337,25 +344,25 @@ bool Player::GetDuration(double &duration)
bool Player::SwitchVideo(int pid) bool Player::SwitchVideo(int pid)
{ {
Track *track = manager.getVideoTrack(pid); Track *track = manager.getVideoTrack(pid);
return track && input.SwitchVideo(track); return input.SwitchVideo(track);
} }
bool Player::SwitchAudio(int pid) bool Player::SwitchAudio(int pid)
{ {
Track *track = manager.getAudioTrack(pid); Track *track = manager.getAudioTrack(pid);
return track && input.SwitchAudio(track); return input.SwitchAudio(track);
} }
bool Player::SwitchSubtitle(int pid) bool Player::SwitchSubtitle(int pid)
{ {
Track *track = manager.getSubtitleTrack(pid); Track *track = manager.getSubtitleTrack(pid);
return track && input.SwitchSubtitle(track); return input.SwitchSubtitle(track);
} }
bool Player::SwitchTeletext(int pid) bool Player::SwitchTeletext(int pid)
{ {
Track *track = manager.getTeletextTrack(pid); Track *track = manager.getTeletextTrack(pid);
return track && input.SwitchTeletext(track); return input.SwitchTeletext(track);
} }
bool Player::GetMetadata(std::vector<std::string> &keys, std::vector<std::string> &values) bool Player::GetMetadata(std::vector<std::string> &keys, std::vector<std::string> &values)
@@ -386,3 +393,35 @@ void Player::RequestAbort()
{ {
abortRequested = true; abortRequested = true;
} }
int Player::GetVideoPid()
{
Track *track = input.videoTrack;
if (track)
return track->pid;
return -1;
}
int Player::GetAudioPid()
{
Track *track = input.audioTrack;
if (track)
return track->pid;
return -1;
}
int Player::GetSubtitlePid()
{
Track *track = input.subtitleTrack;
if (track)
return track->pid;
return -1;
}
int Player::GetTeletextPid()
{
Track *track = input.teletextTrack;
if (track)
return track->pid;
return -1;
}