mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-08 18:44:30 +00:00

Conflicts: CHANGELOG.md bin/console bin/developer bin/setup bower.json composer.json composer.lock features/bootstrap/FeatureContext.php features/bootstrap/GuiContext.php lib/Alchemy/Phrasea/Authentication/Token/TokenValidator.php lib/Alchemy/Phrasea/Command/BuildMissingSubdefs.php lib/Alchemy/Phrasea/Command/CreateCollection.php lib/Alchemy/Phrasea/Command/Developer/JavascriptBuilder.php lib/Alchemy/Phrasea/Controller/Admin/Collection.php lib/Alchemy/Phrasea/Controller/Admin/Databoxes.php lib/Alchemy/Phrasea/Controller/Admin/TaskManager.php lib/Alchemy/Phrasea/Controller/Api/V1.php lib/Alchemy/Phrasea/Controller/Client/Baskets.php lib/Alchemy/Phrasea/Controller/Client/Root.php lib/Alchemy/Phrasea/Controller/Prod/Basket.php lib/Alchemy/Phrasea/Controller/Prod/Export.php lib/Alchemy/Phrasea/Controller/Prod/Property.php lib/Alchemy/Phrasea/Controller/Prod/Records.php lib/Alchemy/Phrasea/Controller/Prod/Tools.php lib/Alchemy/Phrasea/Controller/Prod/Upload.php lib/Alchemy/Phrasea/Controller/Root/Login.php lib/Alchemy/Phrasea/Controller/Thesaurus/Thesaurus.php lib/Alchemy/Phrasea/Core/Event/ApiLoadEndEvent.php lib/Alchemy/Phrasea/Core/Event/ApiLoadStartEvent.php lib/Alchemy/Phrasea/Core/Provider/TaskManagerServiceProvider.php lib/Alchemy/Phrasea/Core/Version.php lib/Alchemy/Phrasea/Exception/XMLParseErrorException.php lib/Alchemy/Phrasea/Helper/DatabaseHelper.php lib/Alchemy/Phrasea/Helper/User/Edit.php lib/Alchemy/Phrasea/SearchEngine/Phrasea/PhraseaEngine.php lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php lib/Doctrine/Entities/AuthFailure.php lib/Doctrine/Entities/Basket.php lib/Doctrine/Entities/BasketElement.php lib/Doctrine/Entities/LazaretAttribute.php lib/Doctrine/Entities/LazaretCheck.php lib/Doctrine/Entities/LazaretFile.php lib/Doctrine/Entities/LazaretSession.php lib/Doctrine/Entities/Session.php lib/Doctrine/Entities/SessionModule.php lib/Doctrine/Entities/StoryWZ.php lib/Doctrine/Entities/UsrList.php lib/Doctrine/Entities/UsrListEntry.php lib/Doctrine/Entities/UsrListOwner.php lib/Doctrine/Entities/ValidationData.php lib/Doctrine/Entities/ValidationParticipant.php lib/Doctrine/Entities/ValidationSession.php lib/Doctrine/Logger/MonologSQLLogger.php lib/Doctrine/Repositories/BasketRepository.php lib/Doctrine/Repositories/ValidationParticipantRepository.php lib/Doctrine/Types/Binary.php lib/Doctrine/Types/Blob.php lib/Doctrine/Types/Enum.php lib/Doctrine/Types/LongBlob.php lib/Doctrine/Types/VarBinary.php lib/classes/API/OAuth2/Account.php lib/classes/API/OAuth2/Application.php lib/classes/API/OAuth2/Application/OfficePlugin.php lib/classes/API/OAuth2/AuthCode.php lib/classes/API/OAuth2/RefreshToken.php lib/classes/API/OAuth2/Token.php lib/classes/API/V1/Abstract.php lib/classes/API/V1/Interface.php lib/classes/API/V1/adapter.php lib/classes/API/V1/exception/abstract.php lib/classes/API/V1/exception/badrequest.php lib/classes/API/V1/exception/forbidden.php lib/classes/API/V1/exception/internalservererror.php lib/classes/API/V1/exception/maintenance.php lib/classes/API/V1/exception/methodnotallowed.php lib/classes/API/V1/exception/notfound.php lib/classes/API/V1/exception/unauthorized.php lib/classes/API/V1/result.php lib/classes/Exception/Feed/EntryNotFound.php lib/classes/Exception/Feed/ItemNotFound.php lib/classes/Exception/Feed/PublisherNotFound.php lib/classes/Feed/Abstract.php lib/classes/Feed/Adapter.php lib/classes/Feed/Aggregate.php lib/classes/Feed/Collection.php lib/classes/Feed/CollectionInterface.php lib/classes/Feed/Entry/Adapter.php lib/classes/Feed/Entry/Collection.php lib/classes/Feed/Entry/CollectionInterface.php lib/classes/Feed/Entry/Interface.php lib/classes/Feed/Entry/Item.php lib/classes/Feed/Entry/ItemInterface.php lib/classes/Feed/Interface.php lib/classes/Feed/Link.php lib/classes/Feed/LinkInterface.php lib/classes/Feed/Publisher/Adapter.php lib/classes/Feed/Publisher/Interface.php lib/classes/Feed/Token.php lib/classes/Feed/TokenAggregate.php lib/classes/Feed/XML/Abstract.php lib/classes/Feed/XML/Atom.php lib/classes/Feed/XML/Cooliris.php lib/classes/Feed/XML/Interface.php lib/classes/Feed/XML/RSS.php lib/classes/Feed/XML/RSS/Image.php lib/classes/Feed/XML/RSS/ImageInterface.php lib/classes/User/Adapter.php lib/classes/User/Interface.php lib/classes/appbox/register.php lib/classes/connection.php lib/classes/connection/abstract.php lib/classes/connection/interface.php lib/classes/connection/pdo.php lib/classes/connection/pdoStatementDebugger.php lib/classes/deprecated/countries.php lib/classes/deprecated/inscript.api.php lib/classes/eventsmanager/event/test.php lib/classes/ftpclient.php lib/classes/http/request.php lib/classes/media/subdef.php lib/classes/module/console/schedulerStart.php lib/classes/module/console/schedulerState.php lib/classes/module/console/schedulerStop.php lib/classes/module/console/taskState.php lib/classes/module/console/tasklist.php lib/classes/module/console/taskrun.php lib/classes/patch/320alpha4b.php lib/classes/patch/3715alpha1a.php lib/classes/patch/379alpha1a.php lib/classes/patch/380alpha10a.php lib/classes/patch/380alpha11a.php lib/classes/patch/380alpha13a.php lib/classes/patch/380alpha14a.php lib/classes/patch/380alpha15a.php lib/classes/patch/380alpha16a.php lib/classes/patch/380alpha17a.php lib/classes/patch/380alpha18a.php lib/classes/patch/380alpha3a.php lib/classes/patch/380alpha4a.php lib/classes/patch/380alpha6a.php lib/classes/patch/380alpha8a.php lib/classes/patch/380alpha9a.php lib/classes/patch/381alpha1b.php lib/classes/patch/381alpha2a.php lib/classes/patch/381alpha3a.php lib/classes/patch/381alpha4a.php lib/classes/patch/383alpha1a.php lib/classes/patch/383alpha2a.php lib/classes/patch/383alpha3a.php lib/classes/patch/383alpha4a.php lib/classes/record/adapter.php lib/classes/record/preview.php lib/classes/recordutils.php lib/classes/recordutils/audio.php lib/classes/recordutils/document.php lib/classes/recordutils/map.php lib/classes/recordutils/video.php lib/classes/registry.php lib/classes/registryInterface.php lib/classes/set/order.php lib/classes/system/url.php lib/classes/task/Scheduler.php lib/classes/task/appboxAbstract.php lib/classes/task/databoxAbstract.php lib/classes/task/manager.php lib/classes/task/period/RecordMover.php lib/classes/task/period/apibridge.php lib/classes/task/period/apiwebhooks.php lib/classes/task/period/archive.php lib/classes/task/period/cindexer.php lib/classes/task/period/emptyColl.php lib/classes/task/period/ftp.php lib/classes/task/period/ftpPull.php lib/classes/task/period/subdef.php lib/classes/task/period/test.php lib/classes/task/period/writemeta.php lib/conf.d/PhraseaFixture/AbstractWZ.php lib/conf.d/PhraseaFixture/Basket/LoadFiveBaskets.php lib/conf.d/PhraseaFixture/Basket/LoadOneBasket.php lib/conf.d/PhraseaFixture/Basket/LoadOneBasketEnv.php lib/conf.d/PhraseaFixture/Lazaret/LoadOneFile.php lib/conf.d/PhraseaFixture/Story/LoadOneStory.php lib/conf.d/PhraseaFixture/UsrLists/ListAbstract.php lib/conf.d/PhraseaFixture/UsrLists/UsrList.php lib/conf.d/PhraseaFixture/UsrLists/UsrListEntry.php lib/conf.d/PhraseaFixture/UsrLists/UsrListOwner.php lib/conf.d/PhraseaFixture/ValidationParticipant/LoadOneParticipant.php lib/conf.d/PhraseaFixture/ValidationParticipant/LoadParticipantWithSession.php lib/conf.d/PhraseaFixture/ValidationSession/LoadOneValidationSession.php templates/web/admin/collection/collection.html.twig templates/web/common/dialog_export.html.twig templates/web/common/menubar.html.twig templates/web/prod/actions/Tools/index.html.twig templates/web/prod/index.html.twig templates/web/prod/upload/upload-flash.html.twig templates/web/prod/upload/upload.html.twig templates/web/report/report_layout_child.html.twig templates/web/setup/step2.html.twig templates/web/thesaurus/new-synonym-dialog.html.twig templates/web/thesaurus/properties.html.twig templates/web/thesaurus/search.html.twig tests/Alchemy/Tests/Phrasea/Application/ApiAbstract.php tests/Alchemy/Tests/Phrasea/Cache/FactoryTest.php tests/Alchemy/Tests/Phrasea/Controller/Admin/AdminCollectionTest.php tests/Alchemy/Tests/Phrasea/Controller/Client/RootTest.php
405 lines
11 KiB
PHP
405 lines
11 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Phraseanet
|
|
*
|
|
* (c) 2005-2015 Alchemy
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
use Alchemy\Phrasea\Media\Subdef\Image;
|
|
use Alchemy\Phrasea\Media\Subdef\Audio;
|
|
use Alchemy\Phrasea\Media\Subdef\Video;
|
|
use Alchemy\Phrasea\Media\Subdef\FlexPaper;
|
|
use Alchemy\Phrasea\Media\Subdef\Gif;
|
|
use Alchemy\Phrasea\Media\Subdef\Subdef as SubdefSpecs;
|
|
use Alchemy\Phrasea\Media\Type\Type as SubdefType;
|
|
use Symfony\Component\Translation\TranslatorInterface;
|
|
|
|
class databox_subdef
|
|
{
|
|
/**
|
|
* The class type of the subdef
|
|
* Is null or one of the CLASS_* constants
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $class;
|
|
protected $devices = [];
|
|
protected $name;
|
|
protected $path;
|
|
protected $subdef_group;
|
|
protected $labels = [];
|
|
protected $write_meta;
|
|
protected $downloadable;
|
|
protected $translator;
|
|
protected static $mediaTypeToSubdefTypes = [
|
|
SubdefType::TYPE_AUDIO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_AUDIO],
|
|
SubdefType::TYPE_DOCUMENT => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_FLEXPAPER],
|
|
SubdefType::TYPE_FLASH => [SubdefSpecs::TYPE_IMAGE],
|
|
SubdefType::TYPE_IMAGE => [SubdefSpecs::TYPE_IMAGE],
|
|
SubdefType::TYPE_VIDEO => [SubdefSpecs::TYPE_IMAGE, SubdefSpecs::TYPE_VIDEO, SubdefSpecs::TYPE_ANIMATION],
|
|
];
|
|
|
|
const CLASS_THUMBNAIL = 'thumbnail';
|
|
const CLASS_PREVIEW = 'preview';
|
|
const CLASS_DOCUMENT = 'document';
|
|
const DEVICE_ALL = 'all';
|
|
const DEVICE_HANDHELD = 'handheld';
|
|
const DEVICE_PRINT = 'print';
|
|
const DEVICE_PROJECTION = 'projection';
|
|
const DEVICE_SCREEN = 'screen';
|
|
const DEVICE_TV = 'tv';
|
|
|
|
/**
|
|
*
|
|
* @param SubdefType $type
|
|
* @param SimpleXMLElement $sd
|
|
*
|
|
* @return databox_subdef
|
|
*/
|
|
public function __construct(SubdefType $type, SimpleXMLElement $sd, TranslatorInterface $translator)
|
|
{
|
|
$this->subdef_group = $type;
|
|
$this->class = (string) $sd->attributes()->class;
|
|
$this->translator = $translator;
|
|
|
|
foreach ($sd->devices as $device) {
|
|
$this->devices[] = (string) $device;
|
|
}
|
|
|
|
$this->name = strtolower($sd->attributes()->name);
|
|
$this->downloadable = p4field::isyes($sd->attributes()->downloadable);
|
|
$this->path = trim($sd->path) !== '' ? p4string::addEndSlash(trim($sd->path)) : '';
|
|
|
|
$this->write_meta = p4field::isyes((string) $sd->meta);
|
|
|
|
foreach ($sd->label as $label) {
|
|
$lang = trim((string) $label->attributes()->lang);
|
|
|
|
if ($lang) {
|
|
$this->labels[$lang] = (string) $label;
|
|
}
|
|
}
|
|
|
|
switch ((string) $sd->mediatype) {
|
|
default:
|
|
case SubdefSpecs::TYPE_IMAGE:
|
|
$this->subdef_type = $this->buildImageSubdef($sd);
|
|
break;
|
|
case SubdefSpecs::TYPE_AUDIO:
|
|
$this->subdef_type = $this->buildAudioSubdef($sd);
|
|
break;
|
|
case SubdefSpecs::TYPE_VIDEO:
|
|
$this->subdef_type = $this->buildVideoSubdef($sd);
|
|
break;
|
|
case SubdefSpecs::TYPE_ANIMATION:
|
|
$this->subdef_type = $this->buildGifSubdef($sd);
|
|
break;
|
|
case SubdefSpecs::TYPE_FLEXPAPER:
|
|
$this->subdef_type = $this->buildFlexPaperSubdef($sd);
|
|
break;
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_class()
|
|
{
|
|
return $this->class;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_path()
|
|
{
|
|
return $this->path;
|
|
}
|
|
|
|
/**
|
|
* The devices matching this subdefinition
|
|
*
|
|
* @return Array
|
|
*/
|
|
public function getDevices()
|
|
{
|
|
return $this->devices;
|
|
}
|
|
|
|
/**
|
|
* The current SubdefType the subdef converts documents
|
|
*
|
|
* @return Alchemy\Phrasea\Media\Subdef\Subdef
|
|
*/
|
|
public function getSubdefType()
|
|
{
|
|
return $this->subdef_type;
|
|
}
|
|
|
|
/**
|
|
* The current Group which the subdef is in (Audio, Video ...)
|
|
*
|
|
* @return Alchemy\Phrasea\Media\Type\Type
|
|
*/
|
|
public function getSubdefGroup()
|
|
{
|
|
return $this->subdef_group;
|
|
}
|
|
|
|
/**
|
|
* An associative label ; keys are i18n languages
|
|
*
|
|
* @return Array
|
|
*/
|
|
public function get_labels()
|
|
{
|
|
return $this->labels;
|
|
}
|
|
|
|
public function get_label($code, $substitute = true)
|
|
{
|
|
if (!isset($this->labels[$code]) && $substitute) {
|
|
return $this->get_name();
|
|
} elseif (isset($this->labels[$code])) {
|
|
return $this->labels[$code];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* boolean
|
|
*
|
|
* @return type
|
|
*/
|
|
public function is_downloadable()
|
|
{
|
|
return $this->downloadable;
|
|
}
|
|
|
|
/**
|
|
* Get an array of Alchemy\Phrasea\Media\Subdef\Subdef available for the current Media Type
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getAvailableSubdefTypes()
|
|
{
|
|
$subdefTypes = [];
|
|
|
|
$availableDevices = [
|
|
self::DEVICE_ALL,
|
|
self::DEVICE_HANDHELD,
|
|
self::DEVICE_PRINT,
|
|
self::DEVICE_PROJECTION,
|
|
self::DEVICE_SCREEN,
|
|
self::DEVICE_TV,
|
|
];
|
|
|
|
if (isset(self::$mediaTypeToSubdefTypes[$this->subdef_group->getType()])) {
|
|
|
|
foreach (self::$mediaTypeToSubdefTypes[$this->subdef_group->getType()] as $subdefType) {
|
|
|
|
if ($subdefType == $this->subdef_type->getType()) {
|
|
$mediatype_obj = $this->subdef_type;
|
|
} else {
|
|
switch ($subdefType) {
|
|
case SubdefSpecs::TYPE_ANIMATION:
|
|
$mediatype_obj = new Gif($this->translator);
|
|
break;
|
|
case SubdefSpecs::TYPE_AUDIO:
|
|
$mediatype_obj = new Audio($this->translator);
|
|
break;
|
|
case SubdefSpecs::TYPE_FLEXPAPER:
|
|
$mediatype_obj = new FlexPaper($this->translator);
|
|
break;
|
|
case SubdefSpecs::TYPE_IMAGE:
|
|
$mediatype_obj = new Image($this->translator);
|
|
break;
|
|
case SubdefSpecs::TYPE_VIDEO:
|
|
$mediatype_obj = new Video($this->translator);
|
|
break;
|
|
default:
|
|
continue;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$mediatype_obj->registerOption(new \Alchemy\Phrasea\Media\Subdef\OptionType\Multi($this->translator->trans('Target Device'), 'devices', $availableDevices, $this->devices));
|
|
|
|
$subdefTypes[] = $mediatype_obj;
|
|
}
|
|
}
|
|
|
|
return $subdefTypes;
|
|
}
|
|
|
|
/**
|
|
* Tells us if we have to write meta datas in the subdef
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function meta_writeable()
|
|
{
|
|
return $this->write_meta;
|
|
}
|
|
|
|
/**
|
|
* The name of the subdef
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_name()
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
/**
|
|
* Get the MediaAlchemyst specs for the current subdef
|
|
*
|
|
* @return type
|
|
*/
|
|
public function getSpecs()
|
|
{
|
|
return $this->subdef_type->getMediaAlchemystSpec();
|
|
}
|
|
|
|
/**
|
|
* An array of Alchemy\Phrasea\Media\Subdef\OptionType\OptionType for the current subdef
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getOptions()
|
|
{
|
|
return $this->subdef_type->getOptions();
|
|
}
|
|
|
|
/**
|
|
* Build Image Subdef object depending the SimpleXMLElement
|
|
*
|
|
* @param SimpleXMLElement $sd
|
|
* @return \Alchemy\Phrasea\Media\Subdef\Video
|
|
*/
|
|
protected function buildImageSubdef(SimpleXMLElement $sd)
|
|
{
|
|
$image = new Image($this->translator);
|
|
|
|
if ($sd->size) {
|
|
$image->setOptionValue(Image::OPTION_SIZE, (int) $sd->size);
|
|
}
|
|
if ($sd->quality) {
|
|
$image->setOptionValue(Image::OPTION_QUALITY, (int) $sd->quality);
|
|
}
|
|
if ($sd->strip) {
|
|
$image->setOptionValue(Image::OPTION_STRIP, p4field::isyes($sd->strip));
|
|
}
|
|
if ($sd->dpi) {
|
|
$image->setOptionValue(Image::OPTION_RESOLUTION, (int) $sd->dpi);
|
|
}
|
|
if ($sd->flatten) {
|
|
$image->setOptionValue(Image::OPTION_FLATTEN, p4field::isyes($sd->flatten));
|
|
}
|
|
|
|
return $image;
|
|
}
|
|
|
|
/**
|
|
* Build Audio Subdef object depending the SimpleXMLElement
|
|
*
|
|
* @param SimpleXMLElement $sd
|
|
* @return \Alchemy\Phrasea\Media\Subdef\Video
|
|
*/
|
|
protected function buildAudioSubdef(SimpleXMLElement $sd)
|
|
{
|
|
$audio = new Audio($this->translator);
|
|
|
|
if ($sd->acodec) {
|
|
$audio->setOptionValue(Audio::OPTION_ACODEC, (string) $sd->acodec);
|
|
}
|
|
if ($sd->audiobitrate) {
|
|
$audio->setOptionValue(Audio::OPTION_AUDIOBITRATE, (int) $sd->audiobitrate);
|
|
}
|
|
if ($sd->audiosamplerate) {
|
|
$audio->setOptionValue(Audio::OPTION_AUDIOSAMPLERATE, (int) $sd->audiosamplerate);
|
|
}
|
|
|
|
return $audio;
|
|
}
|
|
|
|
/**
|
|
* Build Flexpaper Subdef object depending the SimpleXMLElement
|
|
*
|
|
* @param SimpleXMLElement $sd
|
|
* @return \Alchemy\Phrasea\Media\Subdef\Video
|
|
*/
|
|
protected function buildFlexPaperSubdef(SimpleXMLElement $sd)
|
|
{
|
|
return new FlexPaper($this->translator);
|
|
}
|
|
|
|
/**
|
|
* Build GIF Subdef object depending the SimpleXMLElement
|
|
*
|
|
* @param SimpleXMLElement $sd
|
|
* @return \Alchemy\Phrasea\Media\Subdef\Video
|
|
*/
|
|
protected function buildGifSubdef(SimpleXMLElement $sd)
|
|
{
|
|
$gif = new Gif($this->translator);
|
|
|
|
if ($sd->size) {
|
|
$gif->setOptionValue(Gif::OPTION_SIZE, (int) $sd->size);
|
|
}
|
|
if ($sd->delay) {
|
|
$gif->setOptionValue(Gif::OPTION_DELAY, (int) $sd->delay);
|
|
}
|
|
|
|
return $gif;
|
|
}
|
|
|
|
/**
|
|
* Build Video Subdef object depending the SimpleXMLElement
|
|
*
|
|
* @param SimpleXMLElement $sd
|
|
* @return \Alchemy\Phrasea\Media\Subdef\Video
|
|
*/
|
|
protected function buildVideoSubdef(SimpleXMLElement $sd)
|
|
{
|
|
$video = new Video($this->translator);
|
|
|
|
if ($sd->size) {
|
|
$video->setOptionValue(Video::OPTION_SIZE, (int) $sd->size);
|
|
}
|
|
if ($sd->acodec) {
|
|
$video->setOptionValue(Video::OPTION_ACODEC, (string) $sd->acodec);
|
|
}
|
|
if ($sd->vcodec) {
|
|
$video->setOptionValue(Video::OPTION_VCODEC, (string) $sd->vcodec);
|
|
}
|
|
if ($sd->fps) {
|
|
$video->setOptionValue(Video::OPTION_FRAMERATE, (int) $sd->fps);
|
|
}
|
|
if ($sd->bitrate) {
|
|
$video->setOptionValue(Video::OPTION_BITRATE, (int) $sd->bitrate);
|
|
}
|
|
if ($sd->audiobitrate) {
|
|
$video->setOptionValue(Video::OPTION_AUDIOBITRATE, (int) $sd->audiobitrate);
|
|
}
|
|
if ($sd->audiosamplerate) {
|
|
$video->setOptionValue(Video::OPTION_AUDIOSAMPLERATE, (int) $sd->audiosamplerate);
|
|
}
|
|
if ($sd->GOPsize) {
|
|
$video->setOptionValue(Video::OPTION_GOPSIZE, (int) $sd->GOPsize);
|
|
}
|
|
|
|
return $video;
|
|
}
|
|
}
|