From 62be8d53605142d0864968627ab1d80860d5f389 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 20 Mar 2020 08:05:53 -0400 Subject: [PATCH 1/2] 6133 add new default video thumb image --- .../autopsy/filequery/FileSearch.java | 49 +++++++++++------- .../images/failedToCreateVideoThumb.png | Bin 0 -> 2481 bytes 2 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/images/failedToCreateVideoThumb.png diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java index daa4124e8d..ae0e939498 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java @@ -95,6 +95,7 @@ class FileSearch { .build(); private static final int PREVIEW_SIZE = 256; private static volatile TextSummarizer summarizerToUse = null; + private static final BufferedImage VIDEO_DEFAULT_IMAGE = getDefaultVideoThumbnail(); /** * Run the file search and returns the SearchResults object for debugging. @@ -456,6 +457,15 @@ class FileSearch { + "AND blackboard_artifacts.obj_id IN (" + objIdList + ") "; // NON-NLS } + private static BufferedImage getDefaultVideoThumbnail() { + try { + return ImageIO.read(ImageUtils.class.getResourceAsStream("/org/sleuthkit/autopsy/images/failedToCreateVideoThumb.png"));//NON-NLS + } catch (IOException ex) { + logger.log(Level.SEVERE, "Failed to load 'failed to create video' placeholder.", ex); //NON-NLS + } + return null; + } + /** * Get the video thumbnails for a file which exists in a * VideoThumbnailsWrapper and update the VideoThumbnailsWrapper to include @@ -476,7 +486,6 @@ class FileSearch { cacheDirectory = null; logger.log(Level.WARNING, "Unable to get cache directory, video thumbnails will not be saved", ex); } - if (cacheDirectory == null || file.getMd5Hash() == null || !Paths.get(cacheDirectory, VIDEO_THUMBNAIL_DIR, file.getMd5Hash()).toFile().exists()) { java.io.File tempFile; try { @@ -488,7 +497,7 @@ class FileSearch { 0, 0, 0}; - thumbnailWrapper.setThumbnails(createDefaultThumbnailList(), framePositions); + thumbnailWrapper.setThumbnails(createDefaultThumbnailList(VIDEO_DEFAULT_IMAGE), framePositions); return; } if (tempFile.exists() == false || tempFile.length() < file.getSize()) { @@ -502,7 +511,7 @@ class FileSearch { 0, 0, 0}; - thumbnailWrapper.setThumbnails(createDefaultThumbnailList(), framePositions); + thumbnailWrapper.setThumbnails(createDefaultThumbnailList(VIDEO_DEFAULT_IMAGE), framePositions); return; } ContentUtils.writeToFile(file, tempFile, progress, null, true); @@ -523,7 +532,7 @@ class FileSearch { 0, 0, 0}; - thumbnailWrapper.setThumbnails(createDefaultThumbnailList(), framePositions); + thumbnailWrapper.setThumbnails(createDefaultThumbnailList(VIDEO_DEFAULT_IMAGE), framePositions); return; } double fps = videoFile.get(5); // gets frame per second @@ -535,7 +544,7 @@ class FileSearch { 0, 0, 0}; - thumbnailWrapper.setThumbnails(createDefaultThumbnailList(), framePositions); + thumbnailWrapper.setThumbnails(createDefaultThumbnailList(VIDEO_DEFAULT_IMAGE), framePositions); return; } if (Thread.interrupted()) { @@ -544,7 +553,7 @@ class FileSearch { 0, 0, 0}; - thumbnailWrapper.setThumbnails(createDefaultThumbnailList(), framePositions); + thumbnailWrapper.setThumbnails(createDefaultThumbnailList(VIDEO_DEFAULT_IMAGE), framePositions); return; } @@ -573,10 +582,10 @@ class FileSearch { logger.log(Level.WARNING, "Error seeking to " + framePositions[i] + "ms in {0}", file.getParentPath() + "/" + file.getName()); //NON-NLS // If we can't set the time, continue to the next frame position and try again. - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); + videoThumbnails.add(VIDEO_DEFAULT_IMAGE); if (cacheDirectory != null) { try { - ImageIO.write((RenderedImage) ImageUtils.getDefaultThumbnail(), THUMBNAIL_FORMAT, + ImageIO.write(VIDEO_DEFAULT_IMAGE, THUMBNAIL_FORMAT, Paths.get(cacheDirectory, VIDEO_THUMBNAIL_DIR, file.getMd5Hash(), i + "-" + framePositions[i] + "." + THUMBNAIL_FORMAT).toFile()); //NON-NLS) } catch (IOException ex) { logger.log(Level.WARNING, "Unable to save default video thumbnail for " + file.getMd5Hash() + " at frame position " + framePositions[i], ex); @@ -588,10 +597,10 @@ class FileSearch { if (!videoFile.read(imageMatrix)) { logger.log(Level.WARNING, "Error reading frame at " + framePositions[i] + "ms from {0}", file.getParentPath() + "/" + file.getName()); //NON-NLS // If the image is bad for some reason, continue to the next frame position and try again. - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); + videoThumbnails.add(VIDEO_DEFAULT_IMAGE); if (cacheDirectory != null) { try { - ImageIO.write((RenderedImage) ImageUtils.getDefaultThumbnail(), THUMBNAIL_FORMAT, + ImageIO.write(VIDEO_DEFAULT_IMAGE, THUMBNAIL_FORMAT, Paths.get(cacheDirectory, VIDEO_THUMBNAIL_DIR, file.getMd5Hash(), i + "-" + framePositions[i] + "." + THUMBNAIL_FORMAT).toFile()); //NON-NLS) } catch (IOException ex) { logger.log(Level.WARNING, "Unable to save default video thumbnail for " + file.getMd5Hash() + " at frame position " + framePositions[i], ex); @@ -602,10 +611,10 @@ class FileSearch { } // If the image is empty, return since no buffered image can be created. if (imageMatrix.empty()) { - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); + videoThumbnails.add(VIDEO_DEFAULT_IMAGE); if (cacheDirectory != null) { try { - ImageIO.write((RenderedImage) ImageUtils.getDefaultThumbnail(), THUMBNAIL_FORMAT, + ImageIO.write(VIDEO_DEFAULT_IMAGE, THUMBNAIL_FORMAT, Paths.get(cacheDirectory, VIDEO_THUMBNAIL_DIR, file.getMd5Hash(), i + "-" + framePositions[i] + "." + THUMBNAIL_FORMAT).toFile()); //NON-NLS) } catch (IOException ex) { logger.log(Level.WARNING, "Unable to save default video thumbnail for " + file.getMd5Hash() + " at frame position " + framePositions[i], ex); @@ -660,7 +669,7 @@ class FileSearch { videoFile.release(); // close the file} } } else { - loadSavedThumbnails(cacheDirectory, thumbnailWrapper); + loadSavedThumbnails(cacheDirectory, thumbnailWrapper, VIDEO_DEFAULT_IMAGE); } } @@ -674,7 +683,7 @@ class FileSearch { * information about the file and the thumbnails * associated with it. */ - private static void loadSavedThumbnails(String cacheDirectory, VideoThumbnailsWrapper thumbnailWrapper) { + private static void loadSavedThumbnails(String cacheDirectory, VideoThumbnailsWrapper thumbnailWrapper, BufferedImage failedVideoThumbImage) { int[] framePositions = new int[4]; List videoThumbnails = new ArrayList<>(); int thumbnailNumber = 0; @@ -683,7 +692,7 @@ class FileSearch { try { videoThumbnails.add(ImageIO.read(Paths.get(cacheDirectory, VIDEO_THUMBNAIL_DIR, md5, fileName).toFile())); } catch (IOException ex) { - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); + videoThumbnails.add(failedVideoThumbImage); logger.log(Level.WARNING, "Unable to read saved video thumbnail " + fileName + " for " + md5, ex); } int framePos = Integer.valueOf(FilenameUtils.getBaseName(fileName).substring(2)); @@ -699,12 +708,12 @@ class FileSearch { * * @return List containing the default thumbnail. */ - private static List createDefaultThumbnailList() { + private static List createDefaultThumbnailList(BufferedImage failedVideoThumbImage) { List videoThumbnails = new ArrayList<>(); - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); - videoThumbnails.add(ImageUtils.getDefaultThumbnail()); + videoThumbnails.add(failedVideoThumbImage); + videoThumbnails.add(failedVideoThumbImage); + videoThumbnails.add(failedVideoThumbImage); + videoThumbnails.add(failedVideoThumbImage); return videoThumbnails; } diff --git a/Core/src/org/sleuthkit/autopsy/images/failedToCreateVideoThumb.png b/Core/src/org/sleuthkit/autopsy/images/failedToCreateVideoThumb.png new file mode 100644 index 0000000000000000000000000000000000000000..876402c150904d298d8362f4f6b870cdf3735553 GIT binary patch literal 2481 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 literal 0 HcmV?d00001 From ed367ac36a6423ee63d5e13cf09376414e8516ae Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 20 Mar 2020 08:08:58 -0400 Subject: [PATCH 2/2] 6133 clean up changes for video thumbnail --- Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java index ae0e939498..6a5543c9c9 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java @@ -23,7 +23,6 @@ import com.google.common.cache.CacheBuilder; import com.google.common.io.Files; import java.awt.Image; import java.awt.image.BufferedImage; -import java.awt.image.RenderedImage; import java.io.IOException; import java.io.Reader; import java.nio.file.Paths; @@ -457,6 +456,11 @@ class FileSearch { + "AND blackboard_artifacts.obj_id IN (" + objIdList + ") "; // NON-NLS } + /** + * Get the default image to display when a thumbnail is not available. + * + * @return The default video thumbnail. + */ private static BufferedImage getDefaultVideoThumbnail() { try { return ImageIO.read(ImageUtils.class.getResourceAsStream("/org/sleuthkit/autopsy/images/failedToCreateVideoThumb.png"));//NON-NLS