Skip to content

Commit 5191628

Browse files
committed
* Add support for AVSEEK_SIZE to FFmpegFrameGrabber as required by MPEG-TS (issue #1234)
1 parent 5f2ff6a commit 5191628

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11

2+
* Add support for `AVSEEK_SIZE` to `FFmpegFrameGrabber` as required by MPEG-TS ([issue #1234](https://github.com/bytedeco/javacv/issues/1234))
23
* Throw exception on `start()` for already started `FFmpegFrameFilter`, `FFmpegFrameGrabber`, or `FFmpegFrameRecorder` ([issue #1233](https://github.com/bytedeco/javacv/issues/1233))
34
* Add dependency on OpenBLAS/MKL, now used by OpenCV to accelerate some matrix operations
45
* Upgrade dependencies for OpenCV 4.1.0, libdc1394 2.2.6

src/main/java/org/bytedeco/javacv/FFmpegFrameGrabber.java

+30-3
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,36 @@ static class SeekCallback extends Seek_Pointer_long_int {
291291
@Override public long call(Pointer opaque, long offset, int whence) {
292292
try {
293293
InputStream is = inputStreams.get(opaque);
294+
long size = 0;
294295
switch (whence) {
295-
case 0: is.reset(); break;
296-
case 1: break;
296+
case 0: is.reset(); break; // SEEK_SET
297+
case 1: break; // SEEK_CUR
298+
case 2: // SEEK_END
299+
is.reset();
300+
while (true) {
301+
long n = is.skip(Long.MAX_VALUE);
302+
if (n == 0) break;
303+
size += n;
304+
}
305+
offset += size;
306+
is.reset();
307+
break;
308+
case AVSEEK_SIZE:
309+
long remaining = 0;
310+
while (true) {
311+
long n = is.skip(Long.MAX_VALUE);
312+
if (n == 0) break;
313+
remaining += n;
314+
}
315+
is.reset();
316+
while (true) {
317+
long n = is.skip(Long.MAX_VALUE);
318+
if (n == 0) break;
319+
size += n;
320+
}
321+
offset = size - remaining;
322+
is.reset();
323+
break;
297324
default: return -1;
298325
}
299326
long remaining = offset;
@@ -302,7 +329,7 @@ static class SeekCallback extends Seek_Pointer_long_int {
302329
if (skipped == 0) break; // end of the stream
303330
remaining -= skipped;
304331
}
305-
return 0;
332+
return whence == AVSEEK_SIZE ? size : 0;
306333
} catch (Throwable t) {
307334
System.err.println("Error on InputStream.reset() or skip(): " + t);
308335
return -1;

0 commit comments

Comments
 (0)