/* poppler-media.cc: qt interface to poppler * Copyright (C) 2012 Guillermo A. Amaral B. * Copyright (C) 2013, 2018, 2021, 2024 Albert Astals Cid * * 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 #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(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(); } }