node-mac-recorder 2.16.13 โ 2.16.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"permissions": {
|
|
3
3
|
"allow": [
|
|
4
|
-
"Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐งช Testing
|
|
4
|
+
"Bash(FORCE_AVFOUNDATION=1 node -e \"\nconsole.log(''๐งช Testing AVFoundation area recording...'');\nconst MacRecorder = require(''./index.js'');\nconst recorder = new MacRecorder();\n\n// Test specific area recording (top-left 500x500)\nconst options = {\n captureArea: {\n x: 100,\n y: 100, \n width: 500,\n height: 500\n }\n};\n\nrecorder.startRecording(''/tmp/area-test.mov'', options)\n .then(success => {\n console.log(''Area recording:'', success ? ''โ
SUCCESS'' : ''โ FAILED'');\n if (success) {\n setTimeout(() => {\n recorder.stopRecording().then(() => {\n console.log(''โ
Area recording complete'');\n const fs = require(''fs'');\n if (fs.existsSync(''/tmp/area-test.mov'')) {\n const size = Math.round(fs.statSync(''/tmp/area-test.mov'').size/1024);\n console.log(''๐น File size:'', size + ''KB'');\n }\n });\n }, 2000);\n }\n })\n .catch(console.error);\n\")"
|
|
5
5
|
],
|
|
6
6
|
"deny": [],
|
|
7
7
|
"ask": []
|
package/package.json
CHANGED
|
@@ -53,9 +53,14 @@ extern "C" bool startAVFoundationRecording(const std::string& outputPath,
|
|
|
53
53
|
return false;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
// Get display dimensions
|
|
56
|
+
// Get display dimensions - use width/height directly to avoid coordinate issues
|
|
57
57
|
CGRect displayBounds = CGDisplayBounds(displayID);
|
|
58
|
-
CGSize
|
|
58
|
+
CGSize displaySize = CGSizeMake(CGDisplayPixelsWide(displayID), CGDisplayPixelsHigh(displayID));
|
|
59
|
+
CGSize recordingSize = captureRect.size.width > 0 ? captureRect.size : displaySize;
|
|
60
|
+
|
|
61
|
+
NSLog(@"๐ฅ๏ธ Display bounds: %.0f,%.0f %.0fx%.0f", displayBounds.origin.x, displayBounds.origin.y, displayBounds.size.width, displayBounds.size.height);
|
|
62
|
+
NSLog(@"๐ฅ๏ธ Display pixels: %.0fx%.0f", displaySize.width, displaySize.height);
|
|
63
|
+
NSLog(@"๐ฏ Recording size: %.0fx%.0f", recordingSize.width, recordingSize.height);
|
|
59
64
|
|
|
60
65
|
// Video settings with macOS compatibility
|
|
61
66
|
NSString *codecKey;
|
|
@@ -173,6 +178,16 @@ extern "C" bool startAVFoundationRecording(const std::string& outputPath,
|
|
|
173
178
|
CVReturn cvRet = CVPixelBufferPoolCreatePixelBuffer(NULL, localPixelBufferAdaptor.pixelBufferPool, &pixelBuffer);
|
|
174
179
|
|
|
175
180
|
if (cvRet == kCVReturnSuccess && pixelBuffer) {
|
|
181
|
+
// Check pixel buffer dimensions match screen image
|
|
182
|
+
size_t bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
|
|
183
|
+
size_t bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
|
|
184
|
+
size_t imageWidth = CGImageGetWidth(screenImage);
|
|
185
|
+
size_t imageHeight = CGImageGetHeight(screenImage);
|
|
186
|
+
|
|
187
|
+
if (bufferWidth != imageWidth || bufferHeight != imageHeight) {
|
|
188
|
+
NSLog(@"โ ๏ธ Size mismatch! Buffer %zux%zu vs Image %zux%zu", bufferWidth, bufferHeight, imageWidth, imageHeight);
|
|
189
|
+
}
|
|
190
|
+
|
|
176
191
|
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
|
|
177
192
|
|
|
178
193
|
void *pixelData = CVPixelBufferGetBaseAddress(pixelBuffer);
|
package/src/window_selector.mm
CHANGED
|
@@ -875,25 +875,32 @@ void updateOverlay() {
|
|
|
875
875
|
}
|
|
876
876
|
|
|
877
877
|
// Determine if this is a primary display window
|
|
878
|
-
|
|
878
|
+
NSArray *allScreens = [NSScreen screens];
|
|
879
|
+
NSScreen *primaryScreen = [allScreens objectAtIndex:0]; // Primary screen
|
|
880
|
+
NSRect primaryFrame = [primaryScreen frame];
|
|
881
|
+
BOOL isPrimaryDisplayWindow = (x >= primaryFrame.origin.x &&
|
|
882
|
+
x <= primaryFrame.origin.x + primaryFrame.size.width &&
|
|
883
|
+
y >= primaryFrame.origin.y &&
|
|
884
|
+
y <= primaryFrame.origin.y + primaryFrame.size.height);
|
|
879
885
|
|
|
880
886
|
CGFloat localX, localY;
|
|
881
887
|
if (isPrimaryDisplayWindow) {
|
|
882
|
-
// Primary display windows:
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
888
|
+
// Primary display windows: Calculate dynamic offset from combined frame
|
|
889
|
+
NSRect combinedFrame = [g_overlayWindow frame];
|
|
890
|
+
|
|
891
|
+
// Calculate primary screen offset within combined frame
|
|
892
|
+
CGFloat primaryOffsetX = primaryFrame.origin.x - combinedFrame.origin.x;
|
|
893
|
+
CGFloat primaryOffsetY = primaryFrame.origin.y - combinedFrame.origin.y;
|
|
894
|
+
|
|
895
|
+
localX = x + primaryOffsetX;
|
|
896
|
+
localY = ([g_overlayView frame].size.height - (y + primaryOffsetY)) - height;
|
|
897
|
+
|
|
886
898
|
} else {
|
|
887
899
|
// Secondary display windows: Apply standard coordinate transformation
|
|
888
900
|
localX = x - globalOffset.x;
|
|
889
901
|
localY = ([g_overlayView frame].size.height - (y - globalOffset.y)) - height;
|
|
890
902
|
}
|
|
891
903
|
|
|
892
|
-
NSLog(@"๐ง COORDINATE DEBUG: Window (%d, %d) %dx%d [%@]", (int)x, (int)y, (int)width, (int)height, isPrimaryDisplayWindow ? @"PRIMARY" : @"SECONDARY");
|
|
893
|
-
NSLog(@" GlobalOffset: (%.0f, %.0f)", globalOffset.x, globalOffset.y);
|
|
894
|
-
NSLog(@" LocalCoords: (%.0f, %.0f)", localX, localY);
|
|
895
|
-
NSLog(@" ViewFrame: %.0fx%.0f", [g_overlayView frame].size.width, [g_overlayView frame].size.height);
|
|
896
|
-
|
|
897
904
|
// Update overlay view window info for highlighting
|
|
898
905
|
[overlayView setWindowInfo:targetWindow];
|
|
899
906
|
[overlayView setHighlightFrame:NSMakeRect(localX, localY, width, height)];
|