Make sure we flush the cached video if the source file has changed.
This commit is contained in:
parent
bbff5fea41
commit
f14d4e06b8
3 changed files with 24 additions and 10 deletions
|
|
@ -5,10 +5,12 @@ package org.forkalsrud.album.db;
|
||||||
|
|
||||||
public class Chunk {
|
public class Chunk {
|
||||||
|
|
||||||
|
public long timestamp;
|
||||||
public byte[] bits;
|
public byte[] bits;
|
||||||
public byte[] meta;
|
public byte[] meta;
|
||||||
|
|
||||||
public Chunk(int capacity, int metaCapacity) {
|
public Chunk(long timestamp, int capacity, int metaCapacity) {
|
||||||
|
this.timestamp = timestamp;
|
||||||
this.bits = new byte[capacity];
|
this.bits = new byte[capacity];
|
||||||
this.meta = new byte[0];
|
this.meta = new byte[0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ public class MovieDatabase extends TupleBinding<Chunk> {
|
||||||
OperationStatus status = OperationStatus.SUCCESS;
|
OperationStatus status = OperationStatus.SUCCESS;
|
||||||
Transaction txn = environment.beginTransaction(null, null);
|
Transaction txn = environment.beginTransaction(null, null);
|
||||||
while (OperationStatus.SUCCESS.equals(status)) {
|
while (OperationStatus.SUCCESS.equals(status)) {
|
||||||
DatabaseEntry binKey = key(key, seq);
|
DatabaseEntry binKey = key(key, seq++);
|
||||||
status = db.delete(txn, binKey);
|
status = db.delete(txn, binKey);
|
||||||
}
|
}
|
||||||
txn.commitSync();
|
txn.commitSync();
|
||||||
|
|
@ -96,12 +96,13 @@ public class MovieDatabase extends TupleBinding<Chunk> {
|
||||||
public Chunk entryToObject(TupleInput in) {
|
public Chunk entryToObject(TupleInput in) {
|
||||||
|
|
||||||
int version = in.readInt();
|
int version = in.readInt();
|
||||||
if (version != 1 && version != 2) {
|
if (version != 1 && version != 2 && version != 3) {
|
||||||
throw new RuntimeException("I only understand versions 1 and 2");
|
throw new RuntimeException("I only understand versions 1, 2 and 3");
|
||||||
}
|
}
|
||||||
|
long ts = version >= 3 ? in.readLong() : 0;
|
||||||
int lobLen = in.readInt();
|
int lobLen = in.readInt();
|
||||||
int metaLen = version >= 2 ? in.readInt() : 0;
|
int metaLen = version >= 2 ? in.readInt() : 0;
|
||||||
Chunk chunk = new Chunk(lobLen, metaLen);
|
Chunk chunk = new Chunk(ts, lobLen, metaLen);
|
||||||
in.read(chunk.bits, 0, lobLen);
|
in.read(chunk.bits, 0, lobLen);
|
||||||
if (version >= 2) {
|
if (version >= 2) {
|
||||||
in.read(chunk.meta, 0, metaLen);
|
in.read(chunk.meta, 0, metaLen);
|
||||||
|
|
@ -113,7 +114,8 @@ public class MovieDatabase extends TupleBinding<Chunk> {
|
||||||
@Override
|
@Override
|
||||||
public void objectToEntry(Chunk chunk, TupleOutput out) {
|
public void objectToEntry(Chunk chunk, TupleOutput out) {
|
||||||
|
|
||||||
out.writeInt(2); // version 1
|
out.writeInt(3); // version 3
|
||||||
|
out.writeLong(chunk.timestamp);
|
||||||
out.writeInt(chunk.bits.length);
|
out.writeInt(chunk.bits.length);
|
||||||
out.writeInt(chunk.meta.length);
|
out.writeInt(chunk.meta.length);
|
||||||
out.write(chunk.bits);
|
out.write(chunk.bits);
|
||||||
|
|
|
||||||
|
|
@ -159,9 +159,11 @@ public class MovieCoder {
|
||||||
private int chunkNo = 0;
|
private int chunkNo = 0;
|
||||||
private FlvFilter filter;
|
private FlvFilter filter;
|
||||||
private String dbKey;
|
private String dbKey;
|
||||||
|
private long fileTimestamp;
|
||||||
|
|
||||||
public EncodingProcess(File file, Thumbnail thumbnail, Dimension size) {
|
public EncodingProcess(File file, Thumbnail thumbnail, Dimension size) {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
|
this.fileTimestamp = file.lastModified();
|
||||||
this.targetSize = size;
|
this.targetSize = size;
|
||||||
if (targetSize.getWidth() % 2 > 0) targetSize = new Dimension(targetSize.getWidth() + 1, targetSize.getHeight());
|
if (targetSize.getWidth() % 2 > 0) targetSize = new Dimension(targetSize.getWidth() + 1, targetSize.getHeight());
|
||||||
if (targetSize.getHeight() % 2 > 0) targetSize = new Dimension(targetSize.getWidth(), targetSize.getHeight() + 1);
|
if (targetSize.getHeight() % 2 > 0) targetSize = new Dimension(targetSize.getWidth(), targetSize.getHeight() + 1);
|
||||||
|
|
@ -246,7 +248,7 @@ public class MovieCoder {
|
||||||
@Override
|
@Override
|
||||||
public void writeHeader(byte[] data) {
|
public void writeHeader(byte[] data) {
|
||||||
int len = data.length;
|
int len = data.length;
|
||||||
Chunk chunk0 = new Chunk(len, 0);
|
Chunk chunk0 = new Chunk(fileTimestamp, len, 0);
|
||||||
chunk0.bits = data;
|
chunk0.bits = data;
|
||||||
movieDb.store(dbKey, 0, chunk0);
|
movieDb.store(dbKey, 0, chunk0);
|
||||||
notifyListeners(0, false);
|
notifyListeners(0, false);
|
||||||
|
|
@ -290,7 +292,7 @@ public class MovieCoder {
|
||||||
private void startNewChunk() {
|
private void startNewChunk() {
|
||||||
|
|
||||||
this.chunkNo++;
|
this.chunkNo++;
|
||||||
this.currentChunk = new Chunk(chunkSize, 0);
|
this.currentChunk = new Chunk(fileTimestamp, chunkSize, 0);
|
||||||
this.chunkPos = 0;
|
this.chunkPos = 0;
|
||||||
this.remainingCapacity = chunkSize;
|
this.remainingCapacity = chunkSize;
|
||||||
}
|
}
|
||||||
|
|
@ -309,7 +311,7 @@ public class MovieCoder {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// reallocate
|
// reallocate
|
||||||
Chunk last = new Chunk(chunkPos, 0);
|
Chunk last = new Chunk(fileTimestamp, chunkPos, 0);
|
||||||
System.arraycopy(currentChunk.bits, 0, last.bits, 0, chunkPos);
|
System.arraycopy(currentChunk.bits, 0, last.bits, 0, chunkPos);
|
||||||
movieDb.store(key(file, targetSize), chunkNo, last);
|
movieDb.store(key(file, targetSize), chunkNo, last);
|
||||||
currentChunk = null;
|
currentChunk = null;
|
||||||
|
|
@ -353,7 +355,7 @@ public class MovieCoder {
|
||||||
|
|
||||||
// TODO (knut 05 JUL 2011) Come up with a better interface for supporting
|
// TODO (knut 05 JUL 2011) Come up with a better interface for supporting
|
||||||
// range requests etcetera
|
// range requests etcetera
|
||||||
public void stream(File file, Thumbnail thumbnail, String size, OutputStream out) throws IOException, InterruptedException {
|
public void stream(File file, Thumbnail thumbnail, String size, OutputStream out) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
grabStream(file, thumbnail, size).stream(out);
|
grabStream(file, thumbnail, size).stream(out);
|
||||||
|
|
@ -379,6 +381,14 @@ public class MovieCoder {
|
||||||
EncodingProcess ep = currentEncodings.get(key);
|
EncodingProcess ep = currentEncodings.get(key);
|
||||||
Chunk chunk = movieDb.load(key, 0);
|
Chunk chunk = movieDb.load(key, 0);
|
||||||
|
|
||||||
|
// If the file has been modified since our last encoding job finished
|
||||||
|
if (chunk != null && ep == null) {
|
||||||
|
if (chunk.timestamp != file.lastModified()) {
|
||||||
|
log.info(" " + key + " has changed so cache entry wil be refreshed");
|
||||||
|
movieDb.delete(key);
|
||||||
|
chunk = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
// If neither we need to start the encoding process
|
// If neither we need to start the encoding process
|
||||||
if (chunk == null && ep == null) {
|
if (chunk == null && ep == null) {
|
||||||
ep = submitEncodingJob(file, thumbnail, targetSize, key);
|
ep = submitEncodingJob(file, thumbnail, targetSize, key);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue