1 // Created by: Kirill GAVRILOV 2 // Copyright (c) 2019 OPEN CASCADE SAS 3 // 4 // This file is part of Open CASCADE Technology software library. 5 // 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. 11 // 12 // Alternatively, this file may be used under the terms of Open CASCADE 13 // commercial license or contractual agreement. 14 15 #ifndef _Media_Frame_HeaderFile 16 #define _Media_Frame_HeaderFile 17 18 #include <Graphic3d_Vec2.hxx> 19 #include <Image_PixMap.hxx> 20 #include <Standard_Transient.hxx> 21 #include <Standard_Type.hxx> 22 23 struct AVFrame; 24 25 //! AVFrame wrapper - the frame (decoded image/audio sample data) holder. 26 class Media_Frame : public Standard_Transient 27 { 28 DEFINE_STANDARD_RTTIEXT(Media_Frame, Standard_Transient) 29 public: 30 31 //! Convert pixel format from FFmpeg (AVPixelFormat) to OCCT. 32 Standard_EXPORT static Image_Format FormatFFmpeg2Occt (int theFormat); 33 34 //! Convert pixel format from OCCT to FFmpeg (AVPixelFormat). 35 //! Returns -1 (AV_PIX_FMT_NONE) if undefined. 36 Standard_EXPORT static int FormatOcct2FFmpeg (Image_Format theFormat); 37 38 //! Swap AVFrame* within two frames. 39 Standard_EXPORT static void Swap (const Handle(Media_Frame)& theFrame1, 40 const Handle(Media_Frame)& theFrame2); 41 42 public: 43 44 //! Empty constructor 45 Standard_EXPORT Media_Frame(); 46 47 //! Destructor 48 Standard_EXPORT virtual ~Media_Frame(); 49 50 //! Return true if frame does not contain any data. 51 Standard_EXPORT bool IsEmpty() const; 52 53 //! av_frame_unref() wrapper. 54 Standard_EXPORT void Unref(); 55 56 //! Return image dimensions. Size() const57 Graphic3d_Vec2i Size() const { return Graphic3d_Vec2i (SizeX(), SizeY()); } 58 59 //! Return image width. 60 Standard_EXPORT int SizeX() const; 61 62 //! Return image height. 63 Standard_EXPORT int SizeY() const; 64 65 //! Return pixel format (AVPixelFormat). 66 Standard_EXPORT int Format() const; 67 68 //! Return TRUE if YUV range is full. 69 Standard_EXPORT bool IsFullRangeYUV() const; 70 71 //! Access data plane for specified Id. 72 Standard_EXPORT uint8_t* Plane (int thePlaneId) const; 73 74 //! @return linesize in bytes for specified data plane 75 Standard_EXPORT int LineSize (int thePlaneId) const; 76 77 //! @return frame timestamp estimated using various heuristics, in stream time base 78 Standard_EXPORT int64_t BestEffortTimestamp() const; 79 80 //! Return frame. Frame() const81 const AVFrame* Frame() const { return myFrame; } 82 83 //! Return frame. ChangeFrame()84 AVFrame* ChangeFrame() { return myFrame; } 85 86 //! Return presentation timestamp (PTS). Pts() const87 double Pts() const { return myFramePts; } 88 89 //! Set presentation timestamp (PTS). SetPts(double thePts)90 void SetPts (double thePts) { myFramePts = thePts; } 91 92 //! Return PAR. PixelAspectRatio() const93 float PixelAspectRatio() const { return myPixelRatio; } 94 95 //! Set PAR. SetPixelAspectRatio(float theRatio)96 void SetPixelAspectRatio (float theRatio) { myPixelRatio = theRatio; } 97 98 //! Return locked state. IsLocked() const99 bool IsLocked() const { return myIsLocked; } 100 101 //! Lock/free frame for edition. SetLocked(bool theToLock)102 void SetLocked (bool theToLock) { myIsLocked = theToLock; } 103 104 public: 105 106 //! Wrap allocated image pixmap. 107 Standard_EXPORT bool InitWrapper (const Handle(Image_PixMap)& thePixMap); 108 109 protected: 110 111 AVFrame* myFrame; //!< frame 112 double myFramePts; //!< presentation timestamp 113 float myPixelRatio; //!< pixel aspect ratio 114 bool myIsLocked; //!< locked state 115 116 }; 117 118 #endif // _Media_Frame_HeaderFile 119