QtPlayer: getting frame in audio/video threads safely

This commit is contained in:
Duzy Chan
2014-02-12 14:55:49 +08:00
parent 816e76331f
commit 54b905c56c
4 changed files with 12 additions and 4 deletions
+5
View File
@@ -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);
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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
View File
@@ -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);
}