From 56ece5b5ea9c58343ed7e5b694c3b0cdc0294302 Mon Sep 17 00:00:00 2001 From: martii Date: Thu, 29 May 2014 21:57:38 +0200 Subject: [PATCH] libeplayer3/input: allow access to AVFormatContext --- libeplayer3/include/input.h | 4 ++++ libeplayer3/include/player.h | 3 +++ libeplayer3/input.cpp | 16 ++++++++++++++++ libeplayer3/output.cpp | 4 ---- libspark/playback_libeplayer3.cpp | 9 +++++++++ libspark/playback_libeplayer3.h | 6 ++++++ 6 files changed, 38 insertions(+), 4 deletions(-) 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 2dfcbf4..bace4d1 100644 --- a/libspark/playback_libeplayer3.cpp +++ b/libspark/playback_libeplayer3.cpp @@ -362,3 +362,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 0929223..ca032e9 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 #endif 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);