179 lines
5.7 KiB
C++
179 lines
5.7 KiB
C++
/******************************************************************************
|
|
QtAV: Multimedia framework based on Qt and FFmpeg
|
|
Copyright (C) 2014-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_AVPLAYER_PRIVATE_H
|
|
#define QTAV_AVPLAYER_PRIVATE_H
|
|
|
|
#include "AVDemuxer.h"
|
|
#include "AVPlayer.h"
|
|
#include "AudioThread.h"
|
|
#include "VideoThread.h"
|
|
#include "AVDemuxThread.h"
|
|
#include "Logger.h"
|
|
|
|
namespace FAV {
|
|
|
|
static const qint64 kInvalidPosition = std::numeric_limits<qint64>::max();
|
|
class AVPlayer::Private
|
|
{
|
|
public:
|
|
Private();
|
|
~Private();
|
|
|
|
bool checkSourceChange();
|
|
void updateNotifyInterval();
|
|
void applyFrameRate();
|
|
void initStatistics();
|
|
void initBaseStatistics();
|
|
void initCommonStatistics(int s, Statistics::Common* st, AVCodecContext* avctx);
|
|
void initAudioStatistics(int s);
|
|
void initVideoStatistics(int s);
|
|
#if (USE_AUDIO_DISABLE)
|
|
void setAudioDisable(bool disable);
|
|
#endif
|
|
|
|
#if (FIX_PLAYER_END_CLIP)
|
|
void exitThreads();
|
|
#endif
|
|
|
|
#if !(DO_NOT_USE_SUBTITLE)
|
|
void initSubtitleStatistics(int s);
|
|
#endif
|
|
QVariantList getTracksInfo(AVDemuxer* demuxer, AVDemuxer::StreamType st);
|
|
|
|
#if !(DO_NOT_USE_SUBTITLE)
|
|
bool applySubtitleStream(int n, AVPlayer *player);
|
|
#endif
|
|
bool setupAudioThread(AVPlayer *player);
|
|
bool setupVideoThread(AVPlayer *player);
|
|
bool tryApplyDecoderPriority(AVPlayer *player);
|
|
// TODO: what if buffer mode changed during playback?
|
|
void updateBufferValue(PacketBuffer *buf);
|
|
void updateBufferValue();
|
|
//TODO: addAVOutput()
|
|
template<class Out>
|
|
void setAVOutput(Out *&pOut, Out *pNew, AVThread *thread) {
|
|
Out *old = pOut;
|
|
bool delete_old = false;
|
|
if (pOut == pNew) {
|
|
qDebug("output not changed: %p", pOut);
|
|
if (thread && thread->output() == pNew) {//avthread already set that output
|
|
qDebug("avthread already set that output");
|
|
return;
|
|
}
|
|
} else {
|
|
pOut = pNew;
|
|
delete_old = true;
|
|
}
|
|
if (!thread) {
|
|
qDebug("avthread not ready. can not set output.");
|
|
//no avthread, we can delete it safely
|
|
//AVOutput must be allocated in heap. Just like QObject's children.
|
|
if (delete_old) {
|
|
delete old;
|
|
old = 0;
|
|
}
|
|
return;
|
|
}
|
|
//FIXME: what if isPaused()==false but pause(true) in another thread?
|
|
//bool need_lock = isPlaying() && !thread->isPaused();
|
|
//if (need_lock)
|
|
// thread->lock();
|
|
qDebug("set AVThread output");
|
|
thread->setOutput(pOut);
|
|
if (pOut) {
|
|
pOut->setStatistics(&statistics);
|
|
//if (need_lock)
|
|
// thread->unlock(); //??why here?
|
|
}
|
|
//now the old avoutput is not used by avthread, we can delete it safely
|
|
//AVOutput must be allocated in heap. Just like QObject's children.
|
|
if (delete_old) {
|
|
delete old;
|
|
old = 0;
|
|
}
|
|
}
|
|
#if (USE_AUDIO_DISABLE)
|
|
bool audio_disabled;
|
|
#endif
|
|
bool auto_load;
|
|
bool async_load;
|
|
// can be QString, QIODevice*
|
|
QVariant current_source, pendding_source;
|
|
bool loaded; // for current source
|
|
bool relative_time_mode;
|
|
qint64 media_start_pts; // read from media stream
|
|
qint64 media_end;
|
|
bool reset_state;
|
|
qint64 start_position, stop_position;
|
|
qint64 start_position_norm, stop_position_norm; // real position
|
|
int repeat_max, repeat_current;
|
|
int timer_id; //notify position change and check AB repeat range. active when playing
|
|
|
|
int audio_track, video_track;
|
|
|
|
#if !(DO_NOT_USE_SUBTITLE)
|
|
int subtitle_track;
|
|
QVariantList subtitle_tracks;
|
|
#endif
|
|
QString external_audio;
|
|
AVDemuxer audio_demuxer;
|
|
QVariantList audio_tracks, external_audio_tracks;
|
|
BufferMode buffer_mode;
|
|
qint64 buffer_value;
|
|
//the following things are required and must be set not null
|
|
AVDemuxer demuxer;
|
|
AVDemuxThread *read_thread;
|
|
AVClock *clock;
|
|
VideoRenderer *vo; //list? // TODO: remove
|
|
AudioOutput *ao; // TODO: remove
|
|
AudioDecoder *adec;
|
|
VideoDecoder *vdec;
|
|
AudioThread *athread;
|
|
VideoThread *vthread;
|
|
|
|
VideoCapture *vcapture;
|
|
Statistics statistics;
|
|
qreal speed;
|
|
OutputSet *vos, *aos;
|
|
QVector<VideoDecoderId> vc_ids;
|
|
int brightness, contrast, saturation;
|
|
|
|
QVariantHash ac_opt, vc_opt;
|
|
|
|
bool seeking;
|
|
SeekType seek_type;
|
|
qint64 interrupt_timeout;
|
|
|
|
qreal force_fps;
|
|
// timerEvent interval in ms. can divide 1000. depends on media duration, fps etc.
|
|
// <0: auto compute internally, |notify_interval| is the real interval
|
|
int notify_interval;
|
|
MediaStatus status; // status changes can be from demuxer or demux thread
|
|
AVPlayer::State state;
|
|
MediaEndAction end_action;
|
|
QMutex load_mutex;
|
|
|
|
};
|
|
|
|
} //namespace FAV
|
|
#endif // QTAV_AVPLAYER_PRIVATE_H
|