SVG5/qgstreamerplayer.h
2025-10-12 13:55:56 +09:00

253 lines
5.0 KiB
C++

#ifndef QGSTREAMERPLAYER_H
#define QGSTREAMERPLAYER_H
#include <QObject>
#include <gst/gst.h>
#include <gst/app/app.h>
#include <QList>
#include <QElapsedTimer>
class QVideoWidget;
class QRTSPThread;
class QGstreamerPlayer;
typedef struct _CustomDataSink
{
GstElement* m_pQueue;
GstElement* m_pConvert;
GstElement* m_pRate;
GstElement* m_pSink;
GstElement* m_pEncoder;
GstElement* m_pParser;
GstElement* m_pMuxer;
GstElement* m_pQueueFileData;
GstPad* m_pTeePad;
gboolean removing;
GstElement* m_pCaps;
_CustomDataSink()
{
m_pQueue = NULL;
m_pQueueFileData = NULL;
m_pConvert = NULL;
m_pSink = NULL;
m_pTeePad = NULL;
m_pEncoder = NULL;
m_pParser = NULL;
m_pRate = NULL;
m_pMuxer = NULL;
m_pCaps = NULL;
removing = false;
}
}CustomDataSink;
/* Structure to contain all our information, so we can pass it around */
typedef struct _GST_CustomData {
_GST_CustomData()
{
pPlayer = NULL;
pWidget = NULL;
playbin2 = NULL;
pipeline = NULL;
source = NULL;
OptionSrc = NULL;
convert = NULL;
sink = NULL;
bin = NULL;
queue_src = NULL;
queue_sink = NULL;
pThread = NULL;
m_pSink = NULL;
m_pSinks = NULL;
m_pCaps = NULL;
caps_videosrc = NULL;
caps_vidconv1 = NULL;
videoBalance = NULL;
vidconv1 = NULL;
vidconv2 = NULL;
m_bVideoLink = false;
vidrate1 = NULL;
vidscale1 = NULL;
vidClockDisplay = NULL;
caps_vidrate1 = NULL;
caps_vidscale1 = NULL;
appsink_callbacks = NULL;
}
QGstreamerPlayer* pPlayer;
QVideoWidget* pWidget;
GstElement *playbin2; /* Our one and only element */
gboolean playing; /* Are we in the PLAYING state? */
gboolean terminate; /* Should we terminate execution? */
gboolean seek_enabled; /* Is seeking enabled for this media? */
gboolean seek_done; /* Have we performed the seek already? */
gint64 duration; /* How long does this media last, in nanoseconds */
gdouble rate; /* Current playback rate (can be negative) */
GstElement* pipeline;
GstElement* source;
GstElement* videoBalance;
GstCaps* OptionSrc;
GstElement* convert;
GstElement* sink;
GstElement* bin;
GstElement* vidconv1;
GstElement* vidconv2;
GstElement* vidrate1;
GstElement* vidscale1;
GstElement* vidClockDisplay;
GstBus* bus;
GstElement* queue_src;
GstElement* queue_sink;
QRTSPThread* pThread;
GstElement* tee;
GList* m_pSinks;
CustomDataSink* m_pSink;
QString m_strFilename;
GstElement* m_pCaps;
GstElement* caps_videosrc;
GstElement* caps_vidconv1;
GstElement* caps_vidrate1;
GstElement* caps_vidscale1;
bool m_bError;
bool m_bShow;
bool m_bVideoLink;
bool m_bEncoding;
GstAppSinkCallbacks* appsink_callbacks;
QElapsedTimer m_TimerStart;
} GST_CustomData, *PGST_CustomData;
class QGstreamerPlayer : public QObject
{
Q_OBJECT
public:
explicit QGstreamerPlayer(QObject *parent = 0);
virtual ~QGstreamerPlayer();
virtual void OpenMovieFile(QString strFile);
virtual int OpenCamera4(QString strPatameter);
virtual void CreatePipeLineJetson();
virtual void CreatePipeLinePC();
static void app_sink_eos(GstAppSink *sink, gpointer user_data);
static GstFlowReturn app_sink_new_sample(GstAppSink *sink, gpointer user_data);
static GstFlowReturn app_sink_new_preroll(GstAppSink *sink, gpointer user_data);
static void pad_added_handler (GstElement *src, GstPad *new_pad, GST_CustomData *data);
void SetThread(QRTSPThread* pThread);
void SetVideoWidget(QVideoWidget* pWidget);
void Seek(gint64 nPos);
void Pause();
void StopRTSP();
void StartRTSP();
void exitRTSP();
void Resume();
bool IsSeeking();
QList<gint64> m_ListSeeking;
gint64 GetSeekPos();
void SetFrameWidth(int nWidth);
void SetFrameHeight(int nHeight);
int GetFrameWidth();
int GetFrameHeight();
virtual void SaveFile(QString strFilename);
virtual void SaveEnd();
bool IsWorkingRTSP();
void CaptureImage();
bool IsPipeStart();
void ChangeHue(float fValue);
void ChangeSaturation(float fValue);
void Alram();
void SetCaptureMode(int nMode);
int GetCaptuerMode();
qint64 GetVideoLinkTime();
bool IsVideoLink();
bool IsError();
protected:
GError* m_pError;
bool m_bWorkingRTSP;
bool m_bError;
signals:
void SendFinished();
void ExitCapture();
void ErrorCapture();
public slots:
protected:
int m_nTestCount;
bool m_bPipeStart;
bool m_bCaptureImage;
bool m_bSeeking;
GST_CustomData m_DataGST;
GstMessage* m_pMsgGST;
bool m_bTerminate;
QVideoWidget* m_pVideoWidget;
gint64 m_nSeekPos;
int m_nFrameWidth;
int m_nFrameHeight;
int m_nCaptureMode;
};
#endif // QGSTREAMERPLAYER_H