/****************************************************************************** QtAV: Multimedia framework based on Qt and FFmpeg Copyright (C) 2014-2016 Wang Bin * 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::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 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 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