first commit

This commit is contained in:
2026-02-21 17:11:31 +09:00
commit 18b4338361
4001 changed files with 365464 additions and 0 deletions

View File

@@ -0,0 +1,178 @@
/******************************************************************************
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