diff --git a/src/media/media_player.cpp b/src/media/media_player.cpp index 271f334a7..409fcb0de 100644 --- a/src/media/media_player.cpp +++ b/src/media/media_player.cpp @@ -69,6 +69,18 @@ MediaPlayer::configureMediaInputs() devOpts.name = path_; devOpts.loop = "1"; + size_t dot = path_.find_last_of('.'); + std::string ext = dot == std::string::npos ? "" : path_.substr(dot + 1); + bool decodeImg = (ext == "jpeg" || ext == "jpg" || ext == "png" || ext == "pdf"); + + // Force 1fps for static image + if (decodeImg) { + devOpts.format = "image2"; + devOpts.framerate = 1; + } else { + JAMI_WARNING("Guessing file type for {}", path_); + } + if (demuxer_->openInput(devOpts) < 0) { emitInfo(); return false; @@ -112,11 +124,16 @@ MediaPlayer::configureMediaInputs() } }); - fileDuration_ = demuxer_->getDuration(); - if (fileDuration_ <= 0) { - emitInfo(); - return false; + if (decodeImg) { + fileDuration_ = 0; + } else { + fileDuration_ = demuxer_->getDuration(); + if (fileDuration_ <= 0) { + emitInfo(); + return false; + } } + emitInfo(); demuxer_->updateCurrentState(MediaDemuxer::CurrentState::Demuxing); return true; @@ -127,7 +144,7 @@ MediaPlayer::process() { if (!demuxer_) return; - if (streamsFinished()) { + if (fileDuration_ > 0 && streamsFinished()) { audioStreamEnded_ = false; videoStreamEnded_ = false; playFileFromBeginning(); diff --git a/test/unitTest/media/jami.jpg b/test/unitTest/media/jami.jpg new file mode 100644 index 000000000..e1d023d5d Binary files /dev/null and b/test/unitTest/media/jami.jpg differ diff --git a/test/unitTest/media/test_media_player.cpp b/test/unitTest/media/test_media_player.cpp index 5dc719aad..153be0ca0 100644 --- a/test/unitTest/media/test_media_player.cpp +++ b/test/unitTest/media/test_media_player.cpp @@ -41,6 +41,7 @@ private: std::string filePath = "./media/test_video_file.mp4"; void testCreate(); + void testJPG(); void testPause(); void testSeekWhilePaused(); void testSeekWhilePlaying(); @@ -49,6 +50,7 @@ private: CPPUNIT_TEST_SUITE(MediaPlayerTest); CPPUNIT_TEST(testCreate); + CPPUNIT_TEST(testJPG); CPPUNIT_TEST(testPause); CPPUNIT_TEST(testSeekWhilePaused); CPPUNIT_TEST(testSeekWhilePlaying); @@ -117,6 +119,23 @@ MediaPlayerTest::testCreate() JAMI_INFO() << "End testCreate"; } +void +MediaPlayerTest::testJPG() +{ + JAMI_INFO() << "Start testJpg"; + std::string filePathJpg = "./media/jami.jpg"; + auto pid = jami::createMediaPlayer(filePathJpg); + + CPPUNIT_ASSERT(pid == playerId2_); + CPPUNIT_ASSERT(mediaPlayer->getId() == pid); + CPPUNIT_ASSERT(mediaPlayer->isInputValid()); + CPPUNIT_ASSERT(audio_stream_ != -1); + CPPUNIT_ASSERT(video_stream_ != -1); + CPPUNIT_ASSERT(mediaPlayer->isPaused()); + CPPUNIT_ASSERT(mediaPlayer->getPlayerPosition() == 0); + JAMI_INFO() << "End testJpg"; +} + void MediaPlayerTest::testPause() {