diff --git a/libeplayer3/include/input.h b/libeplayer3/include/input.h index 9fef39c..8239019 100644 --- a/libeplayer3/include/input.h +++ b/libeplayer3/include/input.h @@ -47,6 +47,8 @@ class Input friend int interrupt_cb(void *arg); private: + OpenThreads::Mutex mutex; + Track *videoTrack; Track *audioTrack; Track *subtitleTrack; @@ -81,6 +83,8 @@ class Input bool SwitchVideo(Track *track); bool GetMetadata(std::vector &keys, std::vector &values); bool GetReadCount(uint64_t &readcount); + AVFormatContext *GetAVFormatContext(); + void ReleaseAVFormatContext(); }; #endif diff --git a/libeplayer3/include/player.h b/libeplayer3/include/player.h index 9b6e44b..0b53047 100644 --- a/libeplayer3/include/player.h +++ b/libeplayer3/include/player.h @@ -114,6 +114,9 @@ class Player { void RequestAbort(); bool GetChapters(std::vector &positions, std::vector &titles); + AVFormatContext *GetAVFormatContext() { return input.GetAVFormatContext(); } + void ReleaseAVFormatContext() { input.ReleaseAVFormatContext(); } + Player(); }; #endif diff --git a/libeplayer3/input.cpp b/libeplayer3/input.cpp index 9ab4b76..d1b7ec2 100644 --- a/libeplayer3/input.cpp +++ b/libeplayer3/input.cpp @@ -532,6 +532,7 @@ bool Input::Stop() usleep(100000); if (avfc) { + OpenThreads::ScopedLock lock(mutex); for (unsigned int i = 0; i < avfc->nb_streams; i++) avcodec_close(avfc->streams[i]->codec); avformat_close_input(&avfc); @@ -542,6 +543,21 @@ bool Input::Stop() return true; } +AVFormatContext *Input::GetAVFormatContext() +{ + mutex.lock(); + if (avfc) + return avfc; + mutex.unlock(); + return NULL; +} + +void Input::ReleaseAVFormatContext() +{ + if (avfc) + mutex.unlock(); +} + bool Input::Seek(int64_t avts, bool absolute) { if (absolute) diff --git a/libeplayer3/output.cpp b/libeplayer3/output.cpp index 105095f..e812afa 100644 --- a/libeplayer3/output.cpp +++ b/libeplayer3/output.cpp @@ -36,10 +36,6 @@ #include #include -#include -#include -#include - #include "player.h" #include "output.h" #include "writer.h" diff --git a/libspark/playback_libeplayer3.cpp b/libspark/playback_libeplayer3.cpp index 99c3034..de0182e 100644 --- a/libspark/playback_libeplayer3.cpp +++ b/libspark/playback_libeplayer3.cpp @@ -384,3 +384,12 @@ int cPlayback::GetTeletextPid(void) { return player->GetTeletextPid(); } + +AVFormatContext *cPlayback::GetAVFormatContext() +{ + return player ? player->GetAVFormatContext() : NULL; +} + +void cPlayback::ReleaseAVFormatContext() { if (player) + player->ReleaseAVFormatContext(); +} diff --git a/libspark/playback_libeplayer3.h b/libspark/playback_libeplayer3.h index bfbe5fd..be8975e 100644 --- a/libspark/playback_libeplayer3.h +++ b/libspark/playback_libeplayer3.h @@ -10,9 +10,12 @@ typedef enum { } playmode_t; class Player; +struct AVFormatContext; class cPlayback { + friend class CStreamInfo2; + private: bool enabled; bool playing; @@ -58,6 +61,9 @@ class cPlayback void SetTitle(int title); void GetChapters(std::vector &positions, std::vector &titles); void GetMetadata(std::vector &keys, std::vector &values); + + AVFormatContext *GetAVFormatContext(); + void ReleaseAVFormatContext(); #if 0 // Functions that are not used by movieplayer.cpp: bool GetOffset(off64_t &offset);