From 5191628a71f6bc23f6f22fc5b9ddce4c95d36261 Mon Sep 17 00:00:00 2001 From: Samuel Audet Date: Tue, 25 Jun 2019 18:17:53 +0900 Subject: [PATCH] * Add support for `AVSEEK_SIZE` to `FFmpegFrameGrabber` as required by MPEG-TS (issue #1234) --- CHANGELOG.md | 1 + .../bytedeco/javacv/FFmpegFrameGrabber.java | 33 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0f42084..f3246262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ + * Add support for `AVSEEK_SIZE` to `FFmpegFrameGrabber` as required by MPEG-TS ([issue #1234](https://github.com/bytedeco/javacv/issues/1234)) * Throw exception on `start()` for already started `FFmpegFrameFilter`, `FFmpegFrameGrabber`, or `FFmpegFrameRecorder` ([issue #1233](https://github.com/bytedeco/javacv/issues/1233)) * Add dependency on OpenBLAS/MKL, now used by OpenCV to accelerate some matrix operations * Upgrade dependencies for OpenCV 4.1.0, libdc1394 2.2.6 diff --git a/src/main/java/org/bytedeco/javacv/FFmpegFrameGrabber.java b/src/main/java/org/bytedeco/javacv/FFmpegFrameGrabber.java index aa42c5b4..5bc3a14f 100644 --- a/src/main/java/org/bytedeco/javacv/FFmpegFrameGrabber.java +++ b/src/main/java/org/bytedeco/javacv/FFmpegFrameGrabber.java @@ -291,9 +291,36 @@ static class SeekCallback extends Seek_Pointer_long_int { @Override public long call(Pointer opaque, long offset, int whence) { try { InputStream is = inputStreams.get(opaque); + long size = 0; switch (whence) { - case 0: is.reset(); break; - case 1: break; + case 0: is.reset(); break; // SEEK_SET + case 1: break; // SEEK_CUR + case 2: // SEEK_END + is.reset(); + while (true) { + long n = is.skip(Long.MAX_VALUE); + if (n == 0) break; + size += n; + } + offset += size; + is.reset(); + break; + case AVSEEK_SIZE: + long remaining = 0; + while (true) { + long n = is.skip(Long.MAX_VALUE); + if (n == 0) break; + remaining += n; + } + is.reset(); + while (true) { + long n = is.skip(Long.MAX_VALUE); + if (n == 0) break; + size += n; + } + offset = size - remaining; + is.reset(); + break; default: return -1; } long remaining = offset; @@ -302,7 +329,7 @@ static class SeekCallback extends Seek_Pointer_long_int { if (skipped == 0) break; // end of the stream remaining -= skipped; } - return 0; + return whence == AVSEEK_SIZE ? size : 0; } catch (Throwable t) { System.err.println("Error on InputStream.reset() or skip(): " + t); return -1;