@@ -35,6 +35,7 @@ namespace {
3535
3636constexpr auto kClipThreadsCount = 8 ;
3737constexpr auto kAverageGifSize = 320 * 240 ;
38+ constexpr auto kPreparedVideoThumbnailSide = 320 ;
3839constexpr auto kWaitBeforeGifPause = crl::time(200 );
3940
4041QImage PrepareFrame (
@@ -493,13 +494,12 @@ class ReaderPrivate {
493494 if (reader->start (internal::ReaderImplementation::Mode::Silent, firstFramePositionMs)) {
494495 auto firstFrameReadResult = reader->readFramesTill (-1 , ms);
495496 if (firstFrameReadResult == internal::ReaderImplementation::ReadResult::Success) {
496- if (reader->renderFrame (frame ()->original , frame ()->alpha , frame ()->index , QSize ())) {
497- frame ()->original .fill (QColor (0 , 0 , 0 ));
498-
497+ const auto dimensions = reader->frameSize ();
498+ if (!dimensions.isEmpty ()) {
499499 frame ()->positionMs = _seekPositionMs;
500500
501- _width = frame ()-> original .width ();
502- _height = frame ()-> original .height ();
501+ _width = dimensions .width ();
502+ _height = dimensions .height ();
503503 _durationMs = _implementation->durationMs ();
504504 return ProcessResult::Started;
505505 }
@@ -510,13 +510,14 @@ class ReaderPrivate {
510510 } else if (readResult != internal::ReaderImplementation::ReadResult::Success) { // Read the first frame.
511511 return error ();
512512 }
513- if (!_implementation->renderFrame (frame ()->original , frame ()->alpha , frame ()->index , QSize ())) {
513+ const auto dimensions = _implementation->frameSize ();
514+ if (dimensions.isEmpty ()) {
514515 return error ();
515516 }
516517 frame ()->positionMs = _implementation->frameRealTime ();
517518
518- _width = frame ()-> original .width ();
519- _height = frame ()-> original .height ();
519+ _width = dimensions .width ();
520+ _height = dimensions .height ();
520521 _durationMs = _implementation->durationMs ();
521522 return ProcessResult::Started;
522523 }
@@ -784,6 +785,8 @@ bool Manager::handleProcessResult(ReaderPrivate *reader, ProcessResult result, c
784785
785786 if (result == ProcessResult::Started) {
786787 _loadLevel.fetchAndAddRelaxed (reader->_width * reader->_height - kAverageGifSize );
788+ it.key ()->_width = reader->_width ;
789+ it.key ()->_height = reader->_height ;
787790 it.key ()->_durationMs = reader->_durationMs ;
788791 }
789792 // See if we need to pause GIF because it is not displayed right now.
@@ -990,7 +993,13 @@ Ui::PreparedFileInformation PrepareForSending(
990993 auto hasAlpha = false ;
991994 auto readResult = reader->readFramesTill (-1 , crl::now ());
992995 auto readFrame = (readResult == internal::ReaderImplementation::ReadResult::Success);
993- if (readFrame && reader->renderFrame (result.thumbnail , hasAlpha, index, QSize ())) {
996+ const auto dimensions = reader->frameSize ();
997+ result.dimensions = dimensions;
998+ const auto thumbnailSize = dimensions.scaled (
999+ kPreparedVideoThumbnailSide ,
1000+ kPreparedVideoThumbnailSide ,
1001+ Qt::KeepAspectRatio);
1002+ if (readFrame && reader->renderFrame (result.thumbnail , hasAlpha, index, thumbnailSize)) {
9941003 if (hasAlpha && !result.isWebmSticker ) {
9951004 result.thumbnail = Images::Opaque (std::move (result.thumbnail ));
9961005 }
0 commit comments