/** * @param BatchJob $dbBatchJob * @param kExtractMediaJobData $data * @return BatchJob/null */ protected static function fixWebCamSources(BatchJob &$rootBatchJob, BatchJob &$dbBatchJob, kExtractMediaJobData $data) { $mediaInfo = mediaInfoPeer::retrieveById($data->getMediaInfoId()); /* * Check validity of web-cam sources, for: * - h263/sorenson video * - nellymoser audio * - and for following params: * -- Duration>100hrs (KDLSanityLimits::MaxDuration) or * -- Bitrate<10Kbps (KDLSanityLimits::MinBitrate) * then run the webcam-flv-fix procedure */ $webCamVideoCodecs = array("h.263", "h263", "sorenson spark", "vp6"); if (isset($mediaInfo) && (in_array($mediaInfo->getVideoFormat(), $webCamVideoCodecs) || in_array($mediaInfo->getVideoCodecId(), $webCamVideoCodecs)) && (in_array($mediaInfo->getAudioFormat(), array("nellymoser")) || in_array($mediaInfo->getAudioCodecId(), array("nellymoser")))) { if ($mediaInfo->getVideoDuration() > 0) { $durToTest = $mediaInfo->getVideoDuration(); } else { if ($mediaInfo->getAudioDuration() > 0) { $durToTest = $mediaInfo->getAudioDuration(); } else { if ($mediaInfo->getContainerDuration() > 0) { $durToTest = $mediaInfo->getContainerDuration(); } else { $durToTest = 0; } } } if ($durToTest > 0) { $calcBrToTest = $mediaInfo->getFileSize() * 8000 / $durToTest; } else { $calcBrToTest = 0; } if ($mediaInfo->getVideoBitRate() > 0) { $brToTest = $mediaInfo->getVideoBitRate(); } else { if ($mediaInfo->getContainerBitRate() > 0) { $brToTest = $mediaInfo->getContainerBitRate(); } else { $brToTest = $calcBrToTest; } } KalturaLog::log("durToTest({$durToTest}),brToTest({$brToTest}),calcBrToTest({$calcBrToTest})"); if ($durToTest > KDLSanityLimits::MaxDuration || $calcBrToTest > 0 && $calcBrToTest < KDLSanityLimits::MinBitrate || $brToTest > 0 && $brToTest < KDLSanityLimits::MinBitrate) { KalturaLog::err("invalid source, should be fixed"); $flavorAsset = assetPeer::retrieveById($data->getFlavorAssetId()); if ($flavorAsset && $flavorAsset->getVersion() < 40) { $flavorAsset->incrementVersion(); $flavorAsset->save(); $fixedFileName = $data->getSrcFileSyncLocalPath() . ".fixed"; myFlvHandler::fixFlvTimestamps($data->getSrcFileSyncLocalPath(), $fixedFileName); $syncKey = $flavorAsset->getSyncKey(flavorAsset::FILE_SYNC_FLAVOR_ASSET_SUB_TYPE_ASSET); kFileSyncUtils::moveFromFile($fixedFileName, $syncKey); $syncPath = kFileSyncUtils::getLocalFilePathForKey($syncKey); /* * Finish the current extract medi job and start a new one */ kJobsManager::updateBatchJob($dbBatchJob, BatchJob::BATCHJOB_STATUS_FINISHED); kJobsManager::addExtractMediaJob($rootBatchJob, $syncPath, $data->getFlavorAssetId()); return $dbBatchJob; } } } return null; }
/** * @param BatchJob $dbBatchJob * @param kExtractMediaJobData $data * @param BatchJob $twinJob * @return BatchJob */ public static function handleExtractMediaClosed(BatchJob $dbBatchJob, kExtractMediaJobData $data, BatchJob $twinJob = null) { KalturaLog::debug("Extract media closed"); if ($dbBatchJob->getAbort()) { return $dbBatchJob; } $rootBatchJob = $dbBatchJob->getRootJob(); if (!$rootBatchJob) { return $dbBatchJob; } if ($twinJob) { // copy media info $twinData = $twinJob->getData(); if ($twinData->getMediaInfoId()) { $twinMediaInfo = mediaInfoPeer::retrieveByPK($twinData->getMediaInfoId()); if ($twinMediaInfo) { $mediaInfo = $twinMediaInfo->copy(); $mediaInfo->setFlavorAssetId($data->getFlavorAssetId()); $mediaInfo = kBatchManager::addMediaInfo($mediaInfo); $data->setMediaInfoId($mediaInfo->getId()); $dbBatchJob->setData($data); $dbBatchJob->save(); } } } if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_FINISHED) { $entry = $dbBatchJob->getEntry(); if ($entry->getStatus() < entryStatus::READY) { kBatchManager::updateEntry($dbBatchJob, entryStatus::PRECONVERT); } } switch ($dbBatchJob->getJobSubType()) { case mediaInfo::ASSET_TYPE_ENTRY_INPUT: if ($rootBatchJob->getJobType() == BatchJobType::CONVERT_PROFILE) { $conversionsCreated = kBusinessPreConvertDL::decideProfileConvert($dbBatchJob, $rootBatchJob, $data->getMediaInfoId()); if ($conversionsCreated) { // handle the source flavor as if it was converted, makes the entry ready according to ready behavior rules $currentFlavorAsset = flavorAssetPeer::retrieveById($data->getFlavorAssetId()); if ($currentFlavorAsset) { $dbBatchJob = kBusinessPostConvertDL::handleConvertFinished($dbBatchJob, $currentFlavorAsset); } } } break; case mediaInfo::ASSET_TYPE_FLAVOR_INPUT: if ($rootBatchJob->getJobType() == BatchJobType::REMOTE_CONVERT) { $remoteConvertData = $rootBatchJob->getData(); $errDescription = null; $syncKey = null; // TODO - how to get or create the sync key? $newConvertJob = kBusinessPreConvertDL::decideFlavorConvert($syncKey, $remoteConvertData->getFlavorParamsOutputId(), $errDescription, $remoteConvertData->getMediaInfoId(), $dbBatchJob); if (!$newConvertJob) { kJobsManager::failBatchJob($rootBatchJob); } } break; default: // currently do nothing break; } return $dbBatchJob; }
/** * @param BatchJob $dbBatchJob * @param kExtractMediaJobData $data * @param BatchJob $twinJob * @return BatchJob */ public static function handleExtractMediaClosed(BatchJob $dbBatchJob, kExtractMediaJobData $data, BatchJob $twinJob = null) { KalturaLog::debug("Extract media closed"); if ($dbBatchJob->getAbort()) { return $dbBatchJob; } $rootBatchJob = $dbBatchJob->getRootJob(); if (!$rootBatchJob) { return $dbBatchJob; } if ($twinJob) { // copy media info $twinData = $twinJob->getData(); if ($twinData->getMediaInfoId()) { $twinMediaInfo = mediaInfoPeer::retrieveByPK($twinData->getMediaInfoId()); if ($twinMediaInfo) { $mediaInfo = $twinMediaInfo->copy(); $mediaInfo->setFlavorAssetId($data->getFlavorAssetId()); $mediaInfo = kBatchManager::addMediaInfo($mediaInfo); $data->setMediaInfoId($mediaInfo->getId()); $dbBatchJob->setData($data); $dbBatchJob->save(); } } } if ($dbBatchJob->getStatus() == BatchJob::BATCHJOB_STATUS_FINISHED) { $entry = entryPeer::retrieveByPKNoFilter($dbBatchJob->getEntryId()); if ($entry->getStatus() != entryStatus::READY && $entry->getStatus() != entryStatus::DELETED) { kBatchManager::updateEntry($dbBatchJob->getEntryId(), entryStatus::PRECONVERT); } } if ($rootBatchJob->getJobType() == BatchJobType::CONVERT_PROFILE) { kBusinessPreConvertDL::decideProfileConvert($dbBatchJob, $rootBatchJob, $data->getMediaInfoId()); // handle the source flavor as if it was converted, makes the entry ready according to ready behavior rules $currentFlavorAsset = assetPeer::retrieveById($data->getFlavorAssetId()); if ($currentFlavorAsset && $currentFlavorAsset->getStatus() == asset::FLAVOR_ASSET_STATUS_READY) { $dbBatchJob = kBusinessPostConvertDL::handleConvertFinished($dbBatchJob, $currentFlavorAsset); } } return $dbBatchJob; }