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"