Skip to content
Open
Original file line number Diff line number Diff line change
Expand Up @@ -232,9 +232,12 @@ private class VideoProcessor implements SceneProcessor {
private LinkedBlockingQueue<WorkItem> usedItems = new LinkedBlockingQueue<>();
private MjpegFileWriter writer;
private boolean fastMode = true;
private boolean reshapePending = false;
private int newWidth;
private int newHeight;

public void addImage(Renderer renderer, FrameBuffer out) {
if (freeItems == null) {
if (freeItems == null || reshapePending) {
return;
}
try {
Expand Down Expand Up @@ -284,6 +287,14 @@ public void initialize(RenderManager rm, ViewPort viewPort) {

@Override
public void reshape(ViewPort vp, int w, int h) {
if (this.width == w && this.height == h) {
return;
}

// Mark that reshape is pending and store new dimensions
this.newWidth = w;
this.newHeight = h;
this.reshapePending = true;
}

@Override
Expand All @@ -293,6 +304,41 @@ public boolean isInitialized() {

@Override
public void preFrame(float tpf) {
// Handle pending reshape if all work items are available
if (reshapePending && freeItems != null && freeItems.size() >= numCpus) {
// All work items are free, safe to reshape
this.width = newWidth;
this.height = newHeight;
this.reshapePending = false;

// Close the current writer and generate new filename for resized video
if (writer != null) {
try {
writer.finishAVI();
Logger.getLogger(VideoRecorderAppState.class.getName()).log(Level.INFO,
"Window resized from {0}x{1} to {2}x{3}. Previous recording saved to: {4}",
new Object[]{writer.width, writer.height, width, height, file.getAbsolutePath()});
} catch (Exception ex) {
Logger.getLogger(VideoRecorderAppState.class.getName()).log(Level.SEVERE, "Error closing video on reshape", ex);
}
writer = null;

// Generate a new filename for the resized video
String originalPath = file.getAbsolutePath();
int dotIndex = originalPath.lastIndexOf('.');
String basePath = dotIndex > 0 ? originalPath.substring(0, dotIndex) : originalPath;
String extension = dotIndex > 0 ? originalPath.substring(dotIndex) : ".avi";
file = new File(basePath + "-" + (System.currentTimeMillis() / 1000) + extension);
}

// Recreate work items with new dimensions
freeItems.clear();
usedItems.clear();
for (int i = 0; i < numCpus; i++) {
freeItems.add(new WorkItem(width, height));
}
}

if (null == writer) {
try {
writer = new MjpegFileWriter(file, width, height, framerate);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,12 @@ private class VideoProcessor implements SceneProcessor {
private LinkedBlockingQueue<WorkItem> freeItems;
private LinkedBlockingQueue<WorkItem> usedItems = new LinkedBlockingQueue<>();
private MjpegFileWriter writer;
private boolean reshapePending = false;
private int newWidth;
private int newHeight;

public void addImage(Renderer renderer, FrameBuffer out) {
if (freeItems == null) {
if (freeItems == null || reshapePending) {
return;
}
try {
Expand Down Expand Up @@ -269,6 +272,14 @@ public void initialize(RenderManager rm, ViewPort viewPort) {

@Override
public void reshape(ViewPort vp, int w, int h) {
if (this.width == w && this.height == h) {
return;
}

// Mark that reshape is pending and store new dimensions
this.newWidth = w;
this.newHeight = h;
this.reshapePending = true;
}

@Override
Expand All @@ -278,6 +289,41 @@ public boolean isInitialized() {

@Override
public void preFrame(float tpf) {
// Handle pending reshape if all work items are available
if (reshapePending && freeItems != null && freeItems.size() >= numCpus) {
// All work items are free, safe to reshape
this.width = newWidth;
this.height = newHeight;
this.reshapePending = false;

// Close the current writer and generate new filename for resized video
if (writer != null) {
try {
writer.finishAVI();
Logger.getLogger(VideoRecorderAppState.class.getName()).log(Level.INFO,
"Window resized from {0}x{1} to {2}x{3}. Previous recording saved to: {4}",
new Object[]{writer.width, writer.height, width, height, file.getAbsolutePath()});
} catch (Exception ex) {
Logger.getLogger(VideoRecorderAppState.class.getName()).log(Level.SEVERE, "Error closing video on reshape", ex);
}
writer = null;

// Generate a new filename for the resized video
String originalPath = file.getAbsolutePath();
int dotIndex = originalPath.lastIndexOf('.');
String basePath = dotIndex > 0 ? originalPath.substring(0, dotIndex) : originalPath;
String extension = dotIndex > 0 ? originalPath.substring(dotIndex) : ".avi";
file = new File(basePath + "-" + (System.currentTimeMillis() / 1000) + extension);
}

// Recreate work items with new dimensions
freeItems.clear();
usedItems.clear();
for (int i = 0; i < numCpus; i++) {
freeItems.add(new WorkItem(width, height));
}
}

if (null == writer) {
try {
writer = new MjpegFileWriter(file, width, height, framerate);
Expand Down