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,97 @@
/******************************************************************************
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 QAV_DECODER_H
#define QAV_DECODER_H
#include "AVError.h"
#include <QtCore/QVariant>
#include <QtCore/QObject>
namespace FAV {
class Packet;
class AVDecoderPrivate;
class Q_AV_EXPORT AVDecoder : public QObject
{
Q_OBJECT
DPTR_DECLARE_PRIVATE(AVDecoder)
//Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
public:
virtual ~AVDecoder();
virtual QString name() const;
virtual QString description() const;
/*!
* default is open FFmpeg codec context
* codec config must be done before open
* NOTE: open() and close() are not thread safe. You'd better call them in the same thread.
*/
virtual bool open();
virtual bool close();
bool isOpen() const;
virtual void flush();
void setCodecContext(void* codecCtx); //protected
void* codecContext() const;
/*not available if AVCodecContext == 0*/
bool isAvailable() const;
#if (PLAY_SYNC_FIX2)
virtual bool send(const Packet* packet) = 0;
virtual bool receive() = 0;
#endif // PLAY_SYNC_FIX2
virtual bool decode(const Packet& packet) = 0;
int undecodedSize() const; //TODO: remove. always decode whole input data completely
// avcodec_open2
/*!
* \brief setOptions
* 1. If has key "avcodec", it's value (suboption, a hash or map) will be used to set AVCodecContext use av_opt_set and av_dict_set. A value of hash type is ignored.
* we can ignore the flags used in av_dict_xxx because we can use hash api.
* empty value does nothing to current context if it is open, but will clear AVDictionary in the next open.
* AVDictionary is used in avcodec_open2() and will not change unless user call setOptions().
* 2. Set QObject properties for AVDecoder. Use AVDecoder::name() or lower case as a key to set properties. If key not found, assume key is "avcodec"
* 3. If no ket AVDecoder::name() found in the option, set key-value pairs as QObject property-value pairs.
* \param dict
* example:
* "avcodec": {"vismv":"pf"}, "vaapi":{"display":"DRM"}, "copyMode": "ZeroCopy"
* means set avcodec context option vismv=>pf, VA-API display (qt property) to DRM when using VA-API, set copyMode (GPU decoders) property to ZeroCopy
*/
void setOptions(const QVariantHash &dict);
QVariantHash options() const;
Q_SIGNALS:
void error(const FAV::AVError& e); //explictly use FAV::AVError in connection for Qt4 syntax
void descriptionChanged();
protected:
AVDecoder(AVDecoderPrivate& d);
DPTR_DECLARE(AVDecoder)
// force a codec. only used by avcodec sw decoders. TODO: move to public? profile set?
void setCodecName(const QString& name);
QString codecName() const;
virtual void codecNameChanged() {}//signals can not be decared virtual (winrt)
private:
Q_DISABLE_COPY(AVDecoder)
AVDecoder(); // base class, not direct create. only final class has is enough
};
} //namespace FAV
#endif // QAV_DECODER_H