浏览代码

Fix handling of missing video files

Ivan Savenko 1 年之前
父节点
当前提交
31349f3052
共有 3 个文件被更改,包括 17 次插入6 次删除
  1. 15 5
      client/media/CVideoHandler.cpp
  2. 1 1
      client/media/CVideoHandler.h
  3. 1 0
      lib/filesystem/ResourcePath.cpp

+ 15 - 5
client/media/CVideoHandler.cpp

@@ -79,12 +79,17 @@ static std::unique_ptr<CInputStream> findVideoData(const VideoPath & videoToOpen
 	if(CResourceHandler::get()->existsResource(lowQualityVideo))
 	if(CResourceHandler::get()->existsResource(lowQualityVideo))
 		return CResourceHandler::get()->load(lowQualityVideo);
 		return CResourceHandler::get()->load(lowQualityVideo);
 
 
-	return CResourceHandler::get()->load(lowQualityVideoWithDir);
+	if(CResourceHandler::get()->existsResource(lowQualityVideoWithDir))
+		return CResourceHandler::get()->load(lowQualityVideoWithDir);
+
+	return nullptr;
 }
 }
 
 
-void FFMpegStream::openInput(const VideoPath & videoToOpen)
+bool FFMpegStream::openInput(const VideoPath & videoToOpen)
 {
 {
 	input = findVideoData(videoToOpen);
 	input = findVideoData(videoToOpen);
+
+	return input != nullptr;
 }
 }
 
 
 void FFMpegStream::openContext()
 void FFMpegStream::openContext()
@@ -436,7 +441,8 @@ int FFMpegStream::findVideoStream()
 
 
 std::pair<std::unique_ptr<ui8 []>, si64> CAudioInstance::extractAudio(const VideoPath & videoToOpen)
 std::pair<std::unique_ptr<ui8 []>, si64> CAudioInstance::extractAudio(const VideoPath & videoToOpen)
 {
 {
-	openInput(videoToOpen);
+	if (!openInput(videoToOpen))
+		return { nullptr, 0};
 	openContext();
 	openContext();
 	openCodec(findAudioStream());
 	openCodec(findAudioStream());
 
 
@@ -523,7 +529,9 @@ bool CVideoPlayer::openAndPlayVideoImpl(const VideoPath & name, const Point & po
 	auto extractedAudio = audio.extractAudio(name);
 	auto extractedAudio = audio.extractAudio(name);
 	int audioHandle = CCS->soundh->playSound(extractedAudio);
 	int audioHandle = CCS->soundh->playSound(extractedAudio);
 
 
-	instance.openInput(name);
+	if (!instance.openInput(name))
+		return true;
+
 	instance.openVideo();
 	instance.openVideo();
 	instance.prepareOutput(scale, useOverlay);
 	instance.prepareOutput(scale, useOverlay);
 
 
@@ -589,7 +597,9 @@ std::unique_ptr<IVideoInstance> CVideoPlayer::open(const VideoPath & name, bool
 {
 {
 	auto result = std::make_unique<CVideoInstance>();
 	auto result = std::make_unique<CVideoInstance>();
 
 
-	result->openInput(name);
+	if (!result->openInput(name))
+		return nullptr;
+
 	result->openVideo();
 	result->openVideo();
 	result->prepareOutput(scaleToScreen, false);
 	result->prepareOutput(scaleToScreen, false);
 	result->loadNextFrame(); // prepare 1st frame
 	result->loadNextFrame(); // prepare 1st frame

+ 1 - 1
client/media/CVideoHandler.h

@@ -57,7 +57,7 @@ protected:
 public:
 public:
 	virtual ~FFMpegStream();
 	virtual ~FFMpegStream();
 
 
-	void openInput(const VideoPath & fname);
+	bool openInput(const VideoPath & fname);
 };
 };
 
 
 class CAudioInstance final : public FFMpegStream
 class CAudioInstance final : public FFMpegStream

+ 1 - 0
lib/filesystem/ResourcePath.cpp

@@ -154,6 +154,7 @@ std::string EResTypeHelper::getEResTypeAsString(EResType type)
 		MAP_ENUM(TTF_FONT)
 		MAP_ENUM(TTF_FONT)
 		MAP_ENUM(IMAGE)
 		MAP_ENUM(IMAGE)
 		MAP_ENUM(VIDEO)
 		MAP_ENUM(VIDEO)
+		MAP_ENUM(VIDEO_LOW_QUALITY)
 		MAP_ENUM(SOUND)
 		MAP_ENUM(SOUND)
 		MAP_ENUM(ARCHIVE_ZIP)
 		MAP_ENUM(ARCHIVE_ZIP)
 		MAP_ENUM(ARCHIVE_LOD)
 		MAP_ENUM(ARCHIVE_LOD)