diff --git a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/Dockerfile b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/Dockerfile index 465193ac..e4eb132c 100644 --- a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/Dockerfile +++ b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/Dockerfile @@ -1,15 +1,16 @@ -# Image provides a container in which to run FFmpeg transformations for Alfresco Content Services. +# Image provides a container in which to run FFmpeg transformations # TODO PoC for FFmpeg # The FFmpeg transformer uses FFmpeg. See license: https://github.com/FFmpeg/FFmpeg/blob/master/LICENSE.md +# TODO PoC for FFmpeg - "migrate" from CentOS 8 to most recent supported CentoOS 7 (note: may mean using FFmpeg 3.x instead of 4.x) FROM alfresco/alfresco-base-java:11.0.10-openjdk-centos-8@sha256:343c8f63cf80c7af51785b93d6972b0c00087a1c0b995098cb8285c4d9db74b5 -ARG FFMPEG_VERSION=4.2.4 - # TODO PoC for FFmpeg - update & download from Nexus -ENV FFMPEG_RPM_URL=https://download1.rpmfusion.org/free/el/updates/8/x86_64/f/ffmpeg-${FFMPEG_VERSION}.el7.x86_64.rpm +#ARG FFMPEG_VERSION=4.2.5-2 +#ENV FFMPEG_RPM_URL=https://download1.rpmfusion.org/free/el/updates/8/x86_64/f/ffmpeg-${FFMPEG_VERSION}.el7.x86_64.rpm #ENV FFMPEG_LICENSE_FILE=https://github.com/Alfresco/acs-community-packaging/blob/master/distribution/src/main/resources/licenses/3rd-party/TODO-license.txt + ENV JAVA_OPTS="" # Set default user information diff --git a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/Application.java b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/Application.java index efbd674a..da183571 100644 --- a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/Application.java +++ b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/Application.java @@ -2,7 +2,7 @@ * #%L * Alfresco Transform Core * %% - * Copyright (C) 2005 - 2020 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * - diff --git a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/FFmpegController.java b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/FFmpegController.java index f00a8d2f..e466026e 100644 --- a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/FFmpegController.java +++ b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg-boot/src/main/java/org/alfresco/transformer/FFmpegController.java @@ -2,7 +2,7 @@ * #%L * Alfresco Transform Core * %% - * Copyright (C) 2005 - 2020 Alfresco Software Limited + * Copyright (C) 2005 - 2021 Alfresco Software Limited * %% * This file is part of the Alfresco software. * - @@ -65,6 +65,16 @@ public class FFmpegController extends AbstractTransformerController FFmpegController .class); + // note: subset from Gytheio + + public static final String PREFIX_AUDIO = "audio/"; + public static final String PREFIX_IMAGE = "image/"; + public static final String PREFIX_VIDEO = "video/"; + + public static final String MEDIATYPE_IMAGE_SVG = "image/svg+xml"; + public static final String MEDIATYPE_APPLICATION_PHOTOSHOP = "image/vnd.adobe.photoshop"; + public static final String MEDIATYPE_IMG_DWG = "image/vnd.dwg"; + @Value("${transform.core.ffmpeg.exe}") private String execPath; @@ -115,6 +125,67 @@ public class FFmpegController extends AbstractTransformerController public void transformImpl(String transformName, String sourceMimetype, String targetMimetype, Map transformOptions, File sourceFile, File targetFile) { + // note: actual supported transforms are defined by FFmpeg engine config - this is an extra sanity check + if (! isTransformable(sourceMimetype, targetMimetype)) + { + throw new UnsupportedOperationException("Unsupported combinations of source/target media types: "+sourceMimetype+","+targetMimetype); + } + commandExecutor.transform(sourceMimetype, targetMimetype, transformOptions, sourceFile, targetFile); } + + /** + * Determines if the source mimetype is supported by ffmpeg + * + * @param mediaType the mimetype to check + * @return Returns true if ffmpeg can handle the given mimetype format + */ + private static boolean isSupportedSource(String mediaType) + { + return ((mediaType.startsWith(PREFIX_VIDEO) && !( + mediaType.equals("video/x-rad-screenplay") || + mediaType.equals("video/x-sgi-movie") || + mediaType.equals("video/mpeg2"))) || + (mediaType.startsWith(PREFIX_AUDIO) && !( + mediaType.equals("audio/vnd.adobe.soundbooth"))) || + mediaType.equals("application/mxf")); + } + + /** + * Determines if FFmpeg can be made to support the given target mimetype. + * + * @param mimetype the mimetype to check + * @return Returns true if ffmpeg can handle the given mimetype format + */ + private static boolean isSupportedTarget(String mimetype) + { + return ((mimetype.startsWith(PREFIX_VIDEO) && !( + mimetype.equals("video/x-rad-screenplay") || + mimetype.equals("video/x-sgi-movie") || + mimetype.equals("video/mpeg2"))) || + (mimetype.startsWith(PREFIX_IMAGE) && !( + mimetype.equals(MEDIATYPE_IMAGE_SVG) || + mimetype.equals(MEDIATYPE_APPLICATION_PHOTOSHOP) || + mimetype.equals(MEDIATYPE_IMG_DWG) || + mimetype.equals("image/vnd.adobe.premiere") || + mimetype.equals("image/x-portable-anymap") || + mimetype.equals("image/x-xpixmap") || + mimetype.equals("image/x-dwt") || + mimetype.equals("image/cgm") || + mimetype.equals("image/ief"))) || + (mimetype.startsWith(PREFIX_AUDIO) && !( + mimetype.equals("audio/vnd.adobe.soundbooth")))); + } + + // note: based on Gytheio + private boolean isTransformable(String sourceMediaType, String targetMediaType) + { + if (sourceMediaType.startsWith(PREFIX_AUDIO) && + targetMediaType.startsWith(PREFIX_IMAGE)) + { + // Might be able to support audio to waveform image in the future, but for now... + return false; + } + return (isSupportedSource(sourceMediaType) && isSupportedTarget(targetMediaType)); + } } diff --git a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg/src/main/java/org/alfresco/transformer/FFmpegOptionsBuilder.java b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg/src/main/java/org/alfresco/transformer/FFmpegOptionsBuilder.java index fdde9aa6..0fe55dda 100644 --- a/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg/src/main/java/org/alfresco/transformer/FFmpegOptionsBuilder.java +++ b/alfresco-transform-ffmpeg/alfresco-transform-ffmpeg/src/main/java/org/alfresco/transformer/FFmpegOptionsBuilder.java @@ -39,7 +39,7 @@ public final class FFmpegOptionsBuilder private String timeOffset; private Integer framesNum; - // TODO PoC - add FFmpeg options ... + // TODO PoC - add other FFmpeg transform options ... private FFmpegOptionsBuilder() {} public FFmpegOptionsBuilder withTimeOffset(final String timeOffset)