From 7b95bfe39426d82a29b3f7669908204691c97788 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 24 Oct 2019 21:13:13 +0200
Subject: [PATCH] OO-4322: update jcodec to 0.2.3

---
 pom.xml                                       |  7 ++-
 .../services/video/MovieServiceImpl.java      | 48 ++++++++++---------
 .../components/AssessmentRenderFunctions.java |  2 +-
 .../video/manager/VideoManagerImpl.java       | 27 ++++-------
 4 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1c6000f828a..da91347eeef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1882,7 +1882,12 @@
 		<dependency>
 			<groupId>org.jcodec</groupId>
 			<artifactId>jcodec</artifactId>
-			<version>0.1.6-3</version>
+			<version>0.2.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jcodec</groupId>
+			<artifactId>jcodec-javase</artifactId>
+			<version>0.2.3</version>
 		</dependency>
 		<dependency>
 			<groupId>org.mnode.ical4j</groupId>
diff --git a/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java b/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java
index 08dff59d430..36d51ec0fc8 100644
--- a/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java
@@ -28,17 +28,19 @@ import java.nio.channels.FileChannel;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.logging.log4j.Logger;
 import org.jcodec.api.FrameGrab;
-import org.jcodec.common.FileChannelWrapper;
+import org.jcodec.common.Codec;
+import org.jcodec.common.io.FileChannelWrapper;
 import org.jcodec.containers.mp4.boxes.MovieBox;
 import org.jcodec.containers.mp4.demuxer.MP4Demuxer;
+import org.jcodec.scale.AWTUtil;
 import org.olat.core.commons.services.image.Size;
 import org.olat.core.commons.services.image.spi.ImageHelperImpl;
 import org.olat.core.commons.services.thumbnail.CannotGenerateThumbnailException;
 import org.olat.core.commons.services.thumbnail.FinalSize;
 import org.olat.core.commons.services.thumbnail.ThumbnailSPI;
 import org.olat.core.commons.services.video.spi.FLVParser;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.WorkThreadInformations;
@@ -59,18 +61,18 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI {
 	private static final Logger log = Tracing.createLoggerFor(MovieServiceImpl.class);
 
 	private static final List<String> extensions = new ArrayList<>();
-	private static final List<String> fourCCs = new ArrayList<>();
+	private static final List<Codec> supportedCodecs = new ArrayList<>();
 	static {
 		// supported file extensions
 		extensions.add("mp4");
 		extensions.add("m4v");
 		extensions.add("mov");
 		// supported fourCC for H264 codec
-		fourCCs.add("avc1");
-		fourCCs.add("davc");
-		fourCCs.add("h264");
-		fourCCs.add("x264");
-		fourCCs.add("vssh");
+		supportedCodecs.add(Codec.codecByFourcc("avc1"));
+		supportedCodecs.add(Codec.codecByFourcc("davc"));
+		supportedCodecs.add(Codec.codecByFourcc("h264"));
+		supportedCodecs.add(Codec.codecByFourcc("x264"));
+		supportedCodecs.add(Codec.codecByFourcc("vssh"));
 	}
 	
 	
@@ -96,9 +98,10 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI {
 		if(extensions.contains(suffix)) {
 			try(RandomAccessFile accessFile = new RandomAccessFile(file, "r");
 					FileChannel ch = accessFile.getChannel();
-					FileChannelWrapper in = new FileChannelWrapper(ch)) {
+					FileChannelWrapper in = new FileChannelWrapper(ch);
+					MP4Demuxer demuxer1 = MP4Demuxer.createMP4Demuxer(in)) {
+				
 				
-				MP4Demuxer demuxer1 = new MP4Demuxer(in);
 				org.jcodec.common.model.Size size = demuxer1.getMovie().getDisplaySize();
 				// Case 1: standard case, get dimension from movie
 				int w = size.getWidth();
@@ -117,7 +120,7 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI {
 						// flag of the movie. Those mp4 guys are really
 						// secretive folks, did not find any documentation about
 						// this. Best guess.
-						org.jcodec.common.model.Size size2 = demuxer1.getVideoTrack().getBox().getCodedSize();
+						org.jcodec.common.model.Size size2 = demuxer1.getVideoTrack().getMeta().getVideoCodecMeta().getSize();
 						w = size2.getHeight();
 						h = size2.getWidth();					
 					} catch(Exception e) {
@@ -161,9 +164,9 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI {
 		if(extensions.contains(suffix)) {
 			try(RandomAccessFile accessFile = new RandomAccessFile(file, "r");
 				FileChannel ch = accessFile.getChannel();
-				FileChannelWrapper in = new FileChannelWrapper(ch)) {
-
-				MP4Demuxer demuxer1 = new MP4Demuxer(in);
+				FileChannelWrapper in = new FileChannelWrapper(ch);
+				MP4Demuxer demuxer1 = MP4Demuxer.createMP4Demuxer(in)) {
+				
 				MovieBox movie = demuxer1.getMovie();
 				long duration = movie.getDuration();
 				int timescale = movie.getTimescale();
@@ -196,10 +199,9 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI {
 		if(extensions.contains(suffix)) {
 			try(RandomAccessFile accessFile = new RandomAccessFile(file, "r");
 					FileChannel ch = accessFile.getChannel();
-					FileChannelWrapper in = new FileChannelWrapper(ch)) {
-				
-				MP4Demuxer demuxer1 = new MP4Demuxer(in);
-				return demuxer1.getVideoTrack().getFrameCount();
+					FileChannelWrapper in = new FileChannelWrapper(ch);
+					MP4Demuxer demuxer1 = MP4Demuxer.createMP4Demuxer(in)) {
+				return demuxer1.getVideoTrack().getMeta().getTotalFrames();
 			} catch (Exception | AssertionError e) {
 				log.error("Cannot extract num. of frames of: " + media, e);
 			}
@@ -226,12 +228,12 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI {
 					FileChannel ch = accessFile.getChannel();
 					FileChannelWrapper in = new FileChannelWrapper(ch)) {
 				
-				MP4Demuxer demuxer1 = new MP4Demuxer(in);
-				String fourCC = demuxer1.getVideoTrack().getFourcc();
-				if (fourCCs.contains(fourCC.toLowerCase())) {
+				MP4Demuxer demuxer1 = MP4Demuxer.createMP4Demuxer(in);
+				Codec codec = demuxer1.getVideoTrack().getMeta().getCodec();
+				if (supportedCodecs.contains(codec)) {
 					return true;
 				} 
-				log.info("Movie file::" + fileName + " has correct suffix::" + suffix + " but fourCC::" + fourCC + " not in our list of supported codecs.");
+				log.info("Movie file::" + fileName + " has correct suffix::" + suffix + " but fourCC::" + codec + " not in our list of supported codecs.");
 			} catch (Exception | Error e) {
 				// anticipated exception, is not an mp4 file
 			}
@@ -251,7 +253,7 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI {
 				
 				File baseFile = ((LocalFileImpl)file).getBasefile();
 				File scaledImage = ((LocalFileImpl)thumbnailFile).getBasefile();
-				BufferedImage frame = FrameGrab.getFrame(baseFile, 20);
+				BufferedImage frame = AWTUtil.toBufferedImage(FrameGrab.getFrameFromFile(baseFile, 20));
 				Size scaledSize = ImageHelperImpl.calcScaledSize(frame, maxWidth, maxHeight);
 				if(ImageHelperImpl.writeTo(frame, scaledImage, scaledSize, "jpeg")) {
 					size = new FinalSize(scaledSize.getWidth(), scaledSize.getHeight());
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
index d54ef1081e3..3e6f70d96c2 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
@@ -31,8 +31,8 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.IOUtils;
 import org.apache.logging.log4j.Logger;
-import org.jcodec.common.IOUtils;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.logging.Tracing;
diff --git a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
index bcfadbb5807..2f9c11c3cff 100644
--- a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
+++ b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
@@ -28,9 +28,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.RandomAccessFile;
 import java.math.RoundingMode;
-import java.nio.channels.FileChannel;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -49,14 +47,16 @@ import javax.imageio.ImageIO;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.logging.log4j.Logger;
 import org.jcodec.api.FrameGrab;
-import org.jcodec.common.FileChannelWrapper;
+import org.jcodec.common.io.FileChannelWrapper;
+import org.jcodec.common.io.NIOUtils;
+import org.jcodec.scale.AWTUtil;
 import org.olat.core.commons.services.image.Crop;
 import org.olat.core.commons.services.image.ImageService;
 import org.olat.core.commons.services.image.Size;
 import org.olat.core.commons.services.video.MovieService;
 import org.olat.core.gui.translator.Translator;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
@@ -276,19 +276,16 @@ public class VideoManagerImpl implements VideoManager {
 	public boolean getFrame(VFSLeaf video, int frameNumber, VFSLeaf frame) {
 		File videoFile = ((LocalFileImpl)video).getBasefile();
 		
-		try (RandomAccessFile randomAccessFile = new RandomAccessFile(videoFile, "r")) {
-			FileChannel ch = randomAccessFile.getChannel();
-			FileChannelWrapper in = new FileChannelWrapper(ch);
-			FrameGrab frameGrab = new FrameGrab(in).seekToFrameSloppy(frameNumber);
+		try (FileChannelWrapper in = NIOUtils.readableChannel(videoFile)) {
+			FrameGrab frameGrab = FrameGrab.createFrameGrab(in).seekToFrameSloppy(frameNumber);
 			OutputStream frameOutputStream = frame.getOutputStream(false);
 
-			BufferedImage bufImg = frameGrab.getFrame();
+			BufferedImage bufImg = AWTUtil.toBufferedImage(frameGrab.getNativeFrame());
 			ImageIO.write(bufImg, "JPG", frameOutputStream);
 
 			// close everything to prevent resource leaks
 			frameOutputStream.close();
 			in.close();
-			ch.close();
 
 			return true;
 		} catch (Exception | AssertionError e) {
@@ -303,14 +300,11 @@ public class VideoManagerImpl implements VideoManager {
 		BufferedImage bufImg = null;
 		boolean imgBlack = true;
 		int countBlack = 0;
-		try (RandomAccessFile randomAccessFile = new RandomAccessFile(videoFile, "r")) {
+		try (FileChannelWrapper in = NIOUtils.readableChannel(videoFile)) {
 			OutputStream frameOutputStream = frame.getOutputStream(false);
-			
-			FileChannel ch = randomAccessFile.getChannel();
-			FileChannelWrapper in = new FileChannelWrapper(ch);
-			FrameGrab frameGrab = new FrameGrab(in).seekToFrameSloppy(frameNumber);
+			FrameGrab frameGrab = FrameGrab.createFrameGrab(in).seekToFrameSloppy(frameNumber);
 
-			bufImg = frameGrab.getFrame();
+			bufImg = AWTUtil.toBufferedImage(frameGrab.getNativeFrame());
 
 			int xmin = bufImg.getMinX();
 			int ymin = bufImg.getMinY();
@@ -343,7 +337,6 @@ public class VideoManagerImpl implements VideoManager {
 			// close everything to prevent resource leaks
 			frameOutputStream.close();
 			in.close();
-			ch.close();
 
 			return imgBlack;
 		} catch (Exception | AssertionError e) {
-- 
GitLab