blob: d3c30b70e1fd6409ac7bf488f258cddffeb9a47d [file] [log] [blame]
/* poppler-media.cc: qt interface to poppler
* Copyright (C) 2012 Guillermo A. Amaral B. <gamaral@kde.org>
* Copyright (C) 2013, 2018, 2021, 2024 Albert Astals Cid <aacid@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "poppler-media.h"
#include "Rendition.h"
#include "poppler-private.h"
#include <QtCore/QBuffer>
#define BUFFER_MAX 4096
namespace Poppler {
class MediaRenditionPrivate
{
public:
explicit MediaRenditionPrivate(std::unique_ptr<::MediaRendition> &&renditionA) : rendition(std::move(renditionA)) { }
~MediaRenditionPrivate() = default;
MediaRenditionPrivate(const MediaRenditionPrivate &) = delete;
MediaRenditionPrivate &operator=(const MediaRenditionPrivate &) = delete;
std::unique_ptr<::MediaRendition> rendition;
};
MediaRendition::MediaRendition(::MediaRendition *rendition) : MediaRendition(std::unique_ptr<::MediaRendition>(rendition)) { }
MediaRendition::MediaRendition(std::unique_ptr<::MediaRendition> &&rendition) : d_ptr(new MediaRenditionPrivate(std::move(rendition))) { }
MediaRendition::~MediaRendition()
{
delete d_ptr;
}
bool MediaRendition::isValid() const
{
Q_D(const MediaRendition);
return d->rendition && d->rendition->isOk();
}
QString MediaRendition::contentType() const
{
Q_ASSERT(isValid() && "Invalid media rendition.");
Q_D(const MediaRendition);
return UnicodeParsedString(d->rendition->getContentType());
}
QString MediaRendition::fileName() const
{
Q_ASSERT(isValid() && "Invalid media rendition.");
Q_D(const MediaRendition);
return UnicodeParsedString(d->rendition->getFileName());
}
bool MediaRendition::isEmbedded() const
{
Q_ASSERT(isValid() && "Invalid media rendition.");
Q_D(const MediaRendition);
return d->rendition->getIsEmbedded();
}
QByteArray MediaRendition::data() const
{
Q_ASSERT(isValid() && "Invalid media rendition.");
Q_D(const MediaRendition);
Stream *s = d->rendition->getEmbbededStream();
if (!s) {
return QByteArray();
}
QBuffer buffer;
unsigned char data[BUFFER_MAX];
int bread;
buffer.open(QIODevice::WriteOnly);
s->reset();
while ((bread = s->doGetChars(BUFFER_MAX, data)) != 0) {
buffer.write(reinterpret_cast<const char *>(data), bread);
}
buffer.close();
return buffer.data();
}
bool MediaRendition::autoPlay() const
{
Q_D(const MediaRendition);
if (d->rendition->getBEParameters()) {
return d->rendition->getBEParameters()->autoPlay;
} else if (d->rendition->getMHParameters()) {
return d->rendition->getMHParameters()->autoPlay;
} else {
qDebug("No BE or MH parameters to reference!");
}
return false;
}
bool MediaRendition::showControls() const
{
Q_D(const MediaRendition);
if (d->rendition->getBEParameters()) {
return d->rendition->getBEParameters()->showControls;
} else if (d->rendition->getMHParameters()) {
return d->rendition->getMHParameters()->showControls;
} else {
qDebug("No BE or MH parameters to reference!");
}
return false;
}
float MediaRendition::repeatCount() const
{
Q_D(const MediaRendition);
if (d->rendition->getBEParameters()) {
return d->rendition->getBEParameters()->repeatCount;
} else if (d->rendition->getMHParameters()) {
return d->rendition->getMHParameters()->repeatCount;
} else {
qDebug("No BE or MH parameters to reference!");
}
return 1.f;
}
QSize MediaRendition::size() const
{
Q_D(const MediaRendition);
const MediaParameters *mp = nullptr;
if (d->rendition->getBEParameters()) {
mp = d->rendition->getBEParameters();
} else if (d->rendition->getMHParameters()) {
mp = d->rendition->getMHParameters();
} else {
qDebug("No BE or MH parameters to reference!");
}
if (mp) {
return QSize(mp->windowParams.width, mp->windowParams.height);
}
return QSize();
}
}