Browse Source

use filter_complex for overlay. fix tests.

master
Jonathan Cobb 3 years ago
parent
commit
717a7a79d7
4 changed files with 25 additions and 18 deletions
  1. +13
    -15
      src/main/java/jvcl/operation/exec/OverlayExec.java
  2. +10
    -1
      src/test/java/javicle/test/BasicTest.java
  3. +1
    -1
      src/test/resources/tests/test_split.jvcl
  4. +1
    -1
      utils/cobbzilla-utils

+ 13
- 15
src/main/java/jvcl/operation/exec/OverlayExec.java View File

@@ -23,10 +23,9 @@ import static org.cobbzilla.util.system.CommandShell.execScript;
public class OverlayExec extends ExecBase<OverlayOperation> {

public static final String OVERLAY_TEMPLATE
= "ffmpeg -i {{{source.path}}} -vf \""
+ " movie={{{overlay.path}}}:seek_point=0 [ovl]; "
+ " [ovl] setpts=PTS-STARTPTS{{#exists width}}, scale={{width}}x{{height}}{{/exists}} [ovl2] ; "
+ " [main][ovl2] overlay={{{overlayFilterConfig}}}"
= "ffmpeg -i {{{source.path}}} -i {{{overlay.path}}} -filter_complex \""
+ "[1:v] setpts=PTS-STARTPTS+(1/TB){{#exists width}}, scale={{width}}x{{height}}{{/exists}} [1v]; "
+ "[0:v][1v] overlay={{{overlayFilterConfig}}} "
+ "\" {{{output.path}}}";

@Override public void operate(OverlayOperation op, Toolbox toolbox, AssetManager assetManager) {
@@ -53,7 +52,7 @@ public class OverlayExec extends ExecBase<OverlayOperation> {
ctx.put("mainStart", op.getStartTime(ctx, js));
ctx.put("mainEnd", op.getEndTime(ctx, js));

final String overlayFilter = buildOverlayFilter(op, source, overlay, ctx, js);
final String overlayFilter = buildOverlayFilter(op, source, overlaySource, overlay, ctx, js);
ctx.put("overlayFilterConfig", overlayFilter);
ctx.put("output", output);

@@ -82,20 +81,19 @@ public class OverlayExec extends ExecBase<OverlayOperation> {
assetManager.addOperationAsset(output);
}

private String buildOverlayFilter(OverlayOperation op, JAsset source, OverlayOperation.OverlayConfig overlay, Map<String, Object> ctx, StandardJsEngine js) {
// enable=between(t\,15\,20):x=160:y=120
private String buildOverlayFilter(OverlayOperation op,
JAsset source,
JAsset overlaySource,
OverlayOperation.OverlayConfig overlay,
Map<String, Object> ctx,
StandardJsEngine js) {
final StringBuilder b = new StringBuilder();
final BigDecimal startTime = overlay.getStartTime(ctx, js);
if (overlay.hasEndTime()) {
final BigDecimal endTime = overlay.getEndTime(ctx, js);
b.append("enable=between(t\\,").append(startTime).append("\\,").append(endTime).append(")");
} else if (startTime.intValue() > 0) {
b.append("enable=gte(t\\,").append(startTime).append(")");
}
final BigDecimal endTime = overlay.hasEndTime() ? overlay.getEndTime(ctx, js) : overlaySource.duration();
b.append("enable=between(t\\,").append(startTime).append("\\,").append(endTime).append(")");

if (overlay.hasX() && overlay.hasY()) {
if (b.length() > 0) b.append(":");
b.append("x=").append(overlay.getX(ctx, js)).append(":y=").append(overlay.getY(ctx, js));
b.append(":x=").append(overlay.getX(ctx, js)).append(":y=").append(overlay.getY(ctx, js));
}

return b.toString();


+ 10
- 1
src/test/java/javicle/test/BasicTest.java View File

@@ -2,6 +2,7 @@ package javicle.test;

import jvcl.main.Jvcl;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.io.File;
@@ -9,10 +10,12 @@ import java.io.File;
import static org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace;
import static org.cobbzilla.util.daemon.ZillaRuntime.shortError;
import static org.cobbzilla.util.io.FileUtil.abs;
import static org.cobbzilla.util.io.FileUtil.basename;
import static org.cobbzilla.util.io.StreamUtil.loadResourceAsStream;
import static org.cobbzilla.util.io.StreamUtil.stream2file;
import static org.junit.Assert.fail;

@Slf4j
public class BasicTest {

@Test public void testSplitConcatAndTrim () {
@@ -26,10 +29,16 @@ public class BasicTest {
private void runSpec(String specPath) {
try {
@Cleanup("delete") final File specFile = stream2file(loadResourceAsStream(specPath));
Jvcl.main(new String[]{abs(specFile)});
JvclTest.main(new String[]{abs(specFile)});
} catch (Exception e) {
fail("runSpec("+specPath+") failed: "+shortError(e)+"\n"+getStackTrace(e));
}
log.info("runSpec: completed successfully: "+basename(specPath));
}

public static class JvclTest extends Jvcl {
@Override protected boolean exit() { return false; }
public static void main (String[] args) { main(JvclTest.class, args); }
}

}

+ 1
- 1
src/test/resources/tests/test_split.jvcl View File

@@ -19,7 +19,7 @@
"dest": "src/test/resources/outputs/"
},
"split": "vid1", // split this source asset
"interval": "10s", // split every ten seconds
"interval": "10", // split every ten seconds
"start": "65", // start one minute and five seconds into the video
"end": "100" // end 100 seconds into the video
}


+ 1
- 1
utils/cobbzilla-utils

@@ -1 +1 @@
Subproject commit a31b3687f1286dac404e99f4a9835323ab6c0329
Subproject commit 81913bcc9d42c625451043dfa3b0fd482a2ea832

Loading…
Cancel
Save