1 // Created by: Kirill GAVRILOV
2 // Copyright (c) 2019 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #ifndef _Media_PlayerContext_HeaderFile
16 #define _Media_PlayerContext_HeaderFile
18 #include <Media_IFrameQueue.hxx>
19 #include <Media_Timer.hxx>
20 #include <OSD_Thread.hxx>
21 #include <Standard_Condition.hxx>
22 #include <Standard_Mutex.hxx>
23 #include <Standard_Transient.hxx>
24 #include <Standard_Type.hxx>
25 #include <TCollection_AsciiString.hxx>
27 class Media_BufferPool;
28 class Media_CodecContext;
29 class Media_FormatContext;
33 class Media_PlayerContext : public Standard_Transient
35 DEFINE_STANDARD_RTTIEXT(Media_PlayerContext, Standard_Transient)
38 //! Dump first video frame.
39 //! @param theSrcVideo [in] path to the video
40 //! @param theMediaInfo [out] video description
41 Standard_EXPORT static Handle(Media_Frame) DumpFirstFrame (const TCollection_AsciiString& theSrcVideo,
42 TCollection_AsciiString& theMediaInfo);
44 //! Dump first video frame.
45 //! @param theSrcVideo [in] path to the video
46 //! @param theOutImage [in] path to make a screenshot
47 //! @param theMediaInfo [out] video description
48 //! @param theMaxSize [in] when positive - downscales image to specified size
49 Standard_EXPORT static bool DumpFirstFrame (const TCollection_AsciiString& theSrcVideo,
50 const TCollection_AsciiString& theOutImage,
51 TCollection_AsciiString& theMediaInfo,
57 //! Note that Frame Queue is stored as pointer,
58 //! and it is expected that this context is stored as a class field of Frame Queue.
59 Standard_EXPORT Media_PlayerContext (Media_IFrameQueue* theFrameQueue);
62 Standard_EXPORT virtual ~Media_PlayerContext();
66 //! Set new input for playback.
67 Standard_EXPORT void SetInput (const TCollection_AsciiString& theInputPath,
68 Standard_Boolean theToWait);
70 //! Return playback state.
71 Standard_EXPORT void PlaybackState (Standard_Boolean& theIsPaused,
72 Standard_Real& theProgress,
73 Standard_Real& theDuration);
75 //! Pause/Pause playback depending on the current state.
76 Standard_EXPORT void PlayPause (Standard_Boolean& theIsPaused,
77 Standard_Real& theProgress,
78 Standard_Real& theDuration);
80 //! Seek to specified position.
81 Standard_EXPORT void Seek (Standard_Real thePosSec);
84 void Pause() { pushPlayEvent (Media_PlayerEvent_PAUSE); }
87 void Resume() { pushPlayEvent (Media_PlayerEvent_RESUME); }
89 //! Return TRUE if queue requires RGB pixel format or can handle also YUV pixel format; TRUE by default.
90 bool ToForceRgb() const { return myToForceRgb; }
92 //! Set if queue requires RGB pixel format or can handle also YUV pixel format.
93 void SetForceRgb (bool theToForce) { myToForceRgb = theToForce; }
97 //! Internal enumeration for events.
98 enum Media_PlayerEvent
100 Media_PlayerEvent_NONE = 0,
101 Media_PlayerEvent_PAUSE,
102 Media_PlayerEvent_RESUME,
103 Media_PlayerEvent_SEEK,
104 Media_PlayerEvent_NEXT,
110 Standard_EXPORT void doThreadLoop();
112 //! Push new playback event.
113 Standard_EXPORT void pushPlayEvent (Media_PlayerEvent thePlayEvent);
115 //! Fetch new playback event.
116 Standard_EXPORT bool popPlayEvent (Media_PlayerEvent& thePlayEvent,
117 const Handle(Media_FormatContext)& theFormatCtx,
118 const Handle(Media_CodecContext)& theVideoCtx,
119 const Handle(Media_Frame)& theFrame);
121 //! Decode new frame.
122 bool receiveFrame (const Handle(Media_Frame)& theFrame,
123 const Handle(Media_CodecContext)& theVideoCtx);
125 //! Thread creation callback.
126 static Standard_Address doThreadWrapper (Standard_Address theData)
128 Media_PlayerContext* aThis = (Media_PlayerContext* )theData;
129 aThis->doThreadLoop();
135 Media_IFrameQueue* myFrameQueue; //!< frame queue
136 OSD_Thread myThread; //!< working thread
137 Standard_Mutex myMutex; //!< mutex for events
138 Standard_Condition myWakeEvent; //!< event to wake up working thread and proceed new playback event
139 Standard_Condition myNextEvent; //!< event to check if working thread processed next file event (e.g. released file handles of previous input)
140 Media_Timer myTimer; //!< playback timer
141 Standard_Real myDuration; //!< playback duration
143 Handle(Media_BufferPool) myBufferPools[4]; //!< per-plane pools
144 Handle(Media_Frame) myFrameTmp; //!< temporary object holding decoded frame
145 Handle(Media_Scaler) myScaler; //!< pixel format conversion tool
146 bool myToForceRgb; //!< flag indicating if queue requires RGB pixel format or can handle also YUV pixel format
148 volatile bool myToShutDown; //!< flag to terminate working thread
149 TCollection_AsciiString myInputPath; //!< new input to open
150 volatile Standard_Real mySeekTo; //!< new seeking position
151 volatile Media_PlayerEvent myPlayEvent; //!< playback event
155 #endif // _Media_PlayerContext_HeaderFile