Files
fmviewer3/project/fm_viewer/fav/AVThread.h
2026-02-21 17:11:31 +09:00

146 lines
4.3 KiB
C++

/******************************************************************************
QtAV: Multimedia framework based on Qt and FFmpeg
Copyright (C) 2012-2016 Wang Bin <wbsecg1@gmail.com>
* This file is part of QtAV
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
******************************************************************************/
#ifndef QTAV_AVTHREAD_H
#define QTAV_AVTHREAD_H
#include <QtCore/QRunnable>
#include <QtCore/QScopedPointer>
#include <QtCore/QThread>
#include "PacketBuffer.h"
//TODO: pause functions. AVOutput may be null, use AVThread's pause state
namespace FAV {
class AVDecoder;
class AVThreadPrivate;
class AVOutput;
class AVClock;
class Filter;
class Statistics;
class OutputSet;
class AVThread : public QThread
{
Q_OBJECT
DPTR_DECLARE_PRIVATE(AVThread)
public:
explicit AVThread(QObject *parent = 0);
virtual ~AVThread();
int playerID;
#if (FORCE_BREAK_EOF)
bool forceEnd;
bool aboutToEnd; // 종료전 queue 를 비우고 있는 상태
#endif
#if (FIX_PLAYER_END_CLIP)
bool endStop;
#endif//
#if (PREVENT_OVER_DURATION_RENDER)
qreal duration;
#endif
//used for changing some components when running
Q_DECL_DEPRECATED void lock();
Q_DECL_DEPRECATED void unlock();
void setClock(AVClock *clock);
AVClock* clock() const;
PacketBuffer* packetQueue() const;
void setDecoder(AVDecoder *decoder);
AVDecoder *decoder() const;
void setOutput(AVOutput *out); //Q_DECL_DEPRECATED
AVOutput* output() const; //Q_DECL_DEPRECATED
void setOutputSet(OutputSet *set);
OutputSet* outputSet() const;
void setDemuxEnded(bool ended);
bool isPaused() const;
bool waitForStarted(int msec = -1);
bool installFilter(Filter *filter, int index = 0x7FFFFFFF, bool lock = true);
bool uninstallFilter(Filter *filter, bool lock = true);
const QList<Filter *> &filters() const;
// TODO: resample, resize task etc.
void scheduleTask(QRunnable *task);
void requestSeek();
void scheduleFrameDrop(bool value = true);
qreal previousHistoryPts() const; //move to statistics?
qreal decodeFrameRate() const; //move to statistics?
void setDropFrameOnSeek(bool value);
#if (FIX_PLAYER_END_CLIP)
void endStopBy();
#endif
#if (USE_DURATION_IN_THREAD)
double durationSec; // 시간 확인해서 decode thread 종료 void AVDemuxThread::run() 에서 video 만 설정
#endif
public slots:
virtual void stop();
/*change pause state. the pause/continue action will do in the next loop*/
void pause(bool p); //processEvents when waiting?
void nextAndPause(); //process 1 frame and pause
Q_SIGNALS:
void frameDelivered();
/*!
* \brief seekFinished
* \param timestamp the frame pts after seek
*/
#if (PLAY_SYNC_FIX2)
void seekFinished(qint64 timestamp,qint64 requested);
#else // PLAY_SYNC_FIX2
void seekFinished(qint64 timestamp);
#endif // PLAY_SYNC_FIX2
void eofDecoded();
private Q_SLOTS:
void onStarted();
void onFinished();
protected:
AVThread(AVThreadPrivate& d, QObject *parent = 0);
void resetState();
/*
* If the pause state is true setted by pause(true), then block the thread and wait for pause state changed, i.e. pause(false)
* and return true. Otherwise, return false immediatly.
*/
// has timeout so that the pending tasks can be processed
bool tryPause(unsigned long timeout = 100);
bool processNextTask(); //in AVThread
// pts > 0: compare pts and clock when waiting
void waitAndCheck(ulong value, qreal pts);
DPTR_DECLARE(AVThread)
private:
void setStatistics(Statistics* statistics);
friend class AVPlayer;
};
}
#endif // QTAV_AVTHREAD_H