Allow audio and video files with duration < 1s.

This commit is contained in:
John Preston 2017-03-27 15:50:40 +03:00
parent d41372dccd
commit 5666f14829
3 changed files with 24 additions and 22 deletions

View File

@ -849,26 +849,28 @@ FileLoadTask::Video PrepareForSending(const QString &fname, const QByteArray &da
auto reader = std::make_unique<internal::FFMpegReaderImplementation>(&localLocation, &localData, playId); auto reader = std::make_unique<internal::FFMpegReaderImplementation>(&localLocation, &localData, playId);
if (reader->start(internal::ReaderImplementation::Mode::Inspecting, seekPositionMs)) { if (reader->start(internal::ReaderImplementation::Mode::Inspecting, seekPositionMs)) {
auto durationMs = reader->durationMs(); auto durationMs = reader->durationMs();
result.isGifv = reader->isGifv(); if (durationMs > 0) {
if (!result.isGifv) { result.isGifv = reader->isGifv();
auto middleMs = durationMs / 2; if (!result.isGifv) {
if (!reader->inspectAt(middleMs)) { auto middleMs = durationMs / 2;
return result; if (!reader->inspectAt(middleMs)) {
return result;
}
} }
} auto hasAlpha = false;
auto hasAlpha = false; auto readResult = reader->readFramesTill(-1, getms());
auto readResult = reader->readFramesTill(-1, getms()); auto readFrame = (readResult == internal::ReaderImplementation::ReadResult::Success);
auto readFrame = (readResult == internal::ReaderImplementation::ReadResult::Success); if (readFrame && reader->renderFrame(result.thumbnail, hasAlpha, QSize())) {
if (readFrame && reader->renderFrame(result.thumbnail, hasAlpha, QSize())) { if (hasAlpha) {
if (hasAlpha) { auto cacheForResize = QImage();
auto cacheForResize = QImage(); auto request = FrameRequest();
auto request = FrameRequest(); request.framew = request.outerw = result.thumbnail.width();
request.framew = request.outerw = result.thumbnail.width(); request.frameh = request.outerh = result.thumbnail.height();
request.frameh = request.outerh = result.thumbnail.height(); request.factor = 1;
request.factor = 1; result.thumbnail = PrepareFrameImage(request, result.thumbnail, hasAlpha, cacheForResize);
result.thumbnail = PrepareFrameImage(request, result.thumbnail, hasAlpha, cacheForResize); }
result.duration = static_cast<int>(durationMs / 1000);
} }
result.duration = static_cast<int>(durationMs / 1000);
} }
} }
return result; return result;

View File

@ -251,7 +251,7 @@ bool FileLoadTask::CheckForSong(const QString &filepath, const QByteArray &conte
} }
auto media = Media::Player::PrepareForSending(filepath, content); auto media = Media::Player::PrepareForSending(filepath, content);
if (media.duration <= 0) { if (media.duration < 0) {
return false; return false;
} }
if (!ValidateThumbDimensions(media.cover.width(), media.cover.height())) { if (!ValidateThumbDimensions(media.cover.width(), media.cover.height())) {
@ -275,7 +275,7 @@ bool FileLoadTask::CheckForVideo(const QString &filepath, const QByteArray &cont
} }
auto media = Media::Clip::PrepareForSending(filepath, content); auto media = Media::Clip::PrepareForSending(filepath, content);
if (media.duration <= 0) { if (media.duration < 0) {
return false; return false;
} }

View File

@ -244,14 +244,14 @@ public:
bool animated = false; bool animated = false;
}; };
struct Song { struct Song {
int duration = 0; int duration = -1;
QString title; QString title;
QString performer; QString performer;
QImage cover; QImage cover;
}; };
struct Video { struct Video {
bool isGifv = false; bool isGifv = false;
int duration = 0; int duration = -1;
QImage thumbnail; QImage thumbnail;
}; };
struct MediaInformation { struct MediaInformation {