Code Question: Capture Folder Settings

Christopher Vollick 0 at psycoti.ca
Thu Feb 8 00:34:40 GMT 2024


Hey folks! Unsure if there are developers on this list, but figured I'd ask.

I'm looking at the code that picks which directory a capture is saved 
to, and I wanted to make sure I understand what's already there, and the 
intention of it, before I make changes.

I'm going to be basing the line numbers off of current master which is: 
bbc8cc3d47341caa13a0578f8dd4e516e1810885

Ok! So first up we have src/monitor/recmanager.cpp and
src/capture/mediacapture.cpp, which seem pretty similar, but different. 
I know that audio record tracks go through mediacapture, and the code 
for mediacapture seems to imply it can handle both audio and video 
captures, whereas recmanager seems to only do video, but other than that 
I don't know the difference between them.

Secondly, there are two sets of settings in the "Environment" section of 
the settings panel, under "Default Folders". The labels they have are 
"Capture folder" and "Folder for rendering, titles, scripts", but in the 
code they're called "capturetoprojectfolder" and "videotodefaultfolder"

Both of them support the same options:
0: Default folder
1: Project folder
2: Custom folder

Where custom folder is specified in its own field, and in the code is 
called "capturefolderurl" and "videofolderurl" respectively.

So! Code!

Both mediacapture and recmanager have similar code that looks like:
`mediacapture.cpp:446`

     if (KdenliveSettings::capturetoprojectfolder() < 2) {
         captureFolder = QDir(pCore->getProjectFolderName(audioCapture));
     } else {
         captureFolder = QDir(KdenliveSettings::capturefolder());
     }

`recmanager:183`

     if (KdenliveSettings::capturetoprojectfolder() < 2) {
         captureFolder = QDir(pCore->getProjectFolderName());
     } else {
         captureFolder = QDir(KdenliveSettings::capturefolder());
     }

So basically, if capture is set to custom we use the custom one, 
otherwise we call `getProjectFolderName` to figure out where to put this 
thing. The only difference is that mediacapture sometimes only has 
audio, so there's a bool to tell it if it's audio only.

The core method just bounces to `src/doc/kdenlivedoc.cpp:790`:
`KdenliveDoc::projectDataFolder`

So right off the bat we have an if on that `folderForAudio` bool. In 
fact the structure of the code looks like:

     if (folderForAudio) {
         // Logic A, where every branch has a return
     }
     // Logic B, where every branch has a return

Which basically means this is actually two methods, just given one name 
and a bool to pick between them. There is zero logic or variables in 
common between Logic A and Logic B. But the two bits are very _similar_ 
in what they do, even if they don't share anything. They basically both say:

1. If custom, then return custom.
2. If the project file doesn't exist yet, then return the default 
project folder if we're using the project folder, otherwise the default 
video folder.
3. If we're using the project folder, return the project folder
4. Return the default video folder

The main difference is that the Logic A version (folderForAudio == true) 
is using the "capture" settings, and Logic B (folderForAudio == false) 
is using the other one, "videotodefaultfolder" aka "Folder for 
rendering, titles, scripts".

The only other quirk is that the video path has a step 1.5 which says 
"If a newPath has been given to me, and I'm supposed to be picking the 
project folder, return newPath instead". As far as I can tell this is 
only used once in all the code, somewhere in the render dialog, but I'm 
not really sure why. By coming in after step 1 and before the others, it 
seems to mean "if you're custom just pick custom and ignore newPath, if 
you're project then use newPath, and if you're system default then use 
system default and ignore newPath", but I don't know why, and the audio 
path doesn't do that.

Anyway!
So I have a few things that I find weird, but I don't know if they're 
bugs or intended.

The first is that in both recmanager and mediacapture we have that `if` 
on the outside, before we call `getProjectFolderName`, which checks if 
`capturetoprojectfolder` is set to Custom (2). If so it uses that. But 
inside that method, if it's audio it uses the value of 
`capturetoprojectfolder`, but if it's video it uses 
videotodefaultfolder's value instead.

Which means if I have "Capture folder" set to custom, and "Folder for 
rendering, titles, scripts" set to project folder, then it will save 
both audio and video captures to my custom folder. But if I have 
"Capture folder" set to either default or project folder, then audio 
captures will use that setting, but video captures will fall through and 
use the other setting, potentially ending up in a different place.

That feels like a bug to me, but I don't know enough about the intent to 
be sure.

The second question is really just whether or not video captures 
_should_ be using a different path from audio captures, specifically the 
one labeled "Folder for rendering, titles, scripts". There are other 
parts of the code that use that setting (and not the capture settings) 
for things like titles, etc. But was it ever intentional that recmanager 
and mediacapture would put video into that same folder?

I figure there are three options:

1. As-is. Audio capture should go into capture folder, video capture 
should go into video folder. Maybe the custom folder thing is a bit of a 
mixup, or maybe it's not, but the broad strokes are intended.

2. Both audio and video capture should use the capture folder settings, 
whereas other things like titles should use the video folder

3. There should be a third set of options. One for audio capture, one 
for video capture, and one for renders. Video capture shouldn't 
necessarily be put in the same place as titles.

That's the current state of things. Now, in case it might change your 
mind, what I'm planning on _changing_ is making a fourth option for 
audio captures that puts things in a custom *subfolder* of the project 
folder. As in "<project folder>/voiceover" or whatever the user picks. 
So then I wonder how video captures should handle this new plan. Should 
they go into the capture subfolder now? Should that only be for audio 
captures? Or should they have a third set of options that allows them to 
_also_ be put into their _own_ subfolder of the project dir.

I don't really care too much, because I don't make video captures, so it 
doesn't affect me one way or the other, but I've sorta gotta pick 
_something_, whether I choose to include them where it is currently 
excluding them, or if I choose to continue to exclude them even if it's 
a bit weird.

Those are my thoughts. What are yours?


More information about the kdenlive mailing list