You've already forked libopenshot
mirror of
https://github.com/OpenShot/libopenshot.git
synced 2026-06-08 22:17:28 -07:00
QtPlayer: getting frame in audio/video threads safely
This commit is contained in:
@@ -88,6 +88,8 @@ namespace openshot
|
||||
*/
|
||||
class ReaderBase
|
||||
{
|
||||
CriticalSection getFrameCriticalSection;
|
||||
|
||||
public:
|
||||
/// Information about the current media file
|
||||
ReaderInfo info;
|
||||
@@ -106,6 +108,9 @@ namespace openshot
|
||||
/// @param[in] number The frame number that is requested.
|
||||
virtual tr1::shared_ptr<Frame> GetFrame(int number) = 0;
|
||||
|
||||
/// A thread safe version of GetFrame.
|
||||
tr1::shared_ptr<Frame> GetFrameSafe(int number);
|
||||
|
||||
/// Test method to draw a bitmap on a Qt QGraphicsScene
|
||||
void DrawFrameOnScene(string path, long _graphics_scene_address);
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ void AudioReaderSource::GetMoreSamplesFromReader() {
|
||||
if (frame_position == 0) {
|
||||
try {
|
||||
// Get frame object
|
||||
frame = reader->GetFrame(frame_number++);
|
||||
frame = reader->GetFrameSafe(frame_number++);
|
||||
|
||||
} catch (const ReaderClosed & e) {
|
||||
break;
|
||||
|
||||
@@ -90,7 +90,7 @@ namespace openshot
|
||||
tr1::shared_ptr<Frame> PlayerPrivate::getFrame()
|
||||
{
|
||||
try {
|
||||
return reader->GetFrame(position++);
|
||||
return reader->GetFrameSafe(position++);
|
||||
} catch (const ReaderClosed & e) {
|
||||
// ...
|
||||
} catch (const TooManySeeks & e) {
|
||||
|
||||
+5
-2
@@ -215,5 +215,8 @@ void ReaderBase::DrawFrameOnScene(string path, long _graphics_scene_address) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
tr1::shared_ptr<Frame> ReaderBase::GetFrameSafe(int number)
|
||||
{
|
||||
const GenericScopedLock<CriticalSection> lock(getFrameCriticalSection);
|
||||
return GetFrame(number);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user