Video summary
The video introduces Plasma Studio, an ambitious pre-alpha application designed to function as a comprehensive hardware-accelerated media workspace capable of video editing, vector animation, screen capture, and audio processing. The developer showcases the current tabbed interface featuring a node-based graph where users can drag and drop various elements like videos, images, and raw data files to create a workflow. A key highlight is the ability to preview high-resolution content, such as 6K HEVC video, in real-time while applying effects. The system demonstrates impressive performance by maintaining high frame rates even when processing heavy workloads, though the developer notes that current frame drops are due to hardware limitations rather than software inefficiencies.
A significant technical achievement demonstrated is the application's intelligent resource management and non-destructive editing capabilities. The software dynamically calculates the necessary resolution for each node based on the final output requirements; if a 6K video is resized down at the end of the chain, intermediate nodes automatically render at lower resolutions to save memory without losing quality when the image is scaled back up later. This approach allows for complex transformations, such as moving objects or applying geometric changes, without degrading the original data. Furthermore, the project utilizes a QML-based architecture that supports hardware acceleration, enabling smooth playback of massive video files on older integrated graphics cards, and the source code is open-source and publicly available for community review and contribution.
The developer outlines a robust set of features currently under development, including support for vector graphics with paths, polygons, and gradients, as well as advanced compositing modes like blending and masking. The system supports animations where properties can be keyframed over time, complete with easing curves and delay nodes to synchronize multiple elements within a unified timeline. While some features like audio processing and video concatenation are still in progress or broken due to bugs, the roadmap includes implementing dedicated renderers and streamers similar to OBS, integrating MPV for better performance, and expanding the library of graphical effects. The project aims to evolve from a personal experiment into an official KDE Hackathon project, inviting community assistance with debugging, GPU-specific optimizations, and feature implementation to bring this versatile media tool to fruition.
Read the full video transcript
A couple of weeks ago, I told you that I
was trying to do this weird application
that can do video editing but hardware
accelerated and that I can also do like
vector animations and that can also do
OBS and that can also do Audacity kind
of stuff and maybe even more in the
future. And I laid out my plan and now
it's been 2 weeks and I would like to
update you all on the development of
this
weird overambitious application. So, let
me show you.
Here is Plasma Plasma Studio
pre-alpha. Like it's just a couple of
weeks of development. What did you
expect? But actually, there is a lot to
to like, I think, already. Let me show
you. Firstly, we've got this tabbed
interface, which I really like with all
of the tools that you have at your
disposal. And this here, white, is um
a node graph. So, you can actually drag
and drop anything and drop it here and
it's going to uh you know, create a
node. And uh I dropped a video as an
example and by default it loads
a local video, but you can just assign
it to anything.
And you can drag it around, obviously.
And if you double click it, you can
actually preview
the video the the node and you can play
it.
And this, as a reference, is a 6K. can
see the resolution here, 10-bit HEVC
video. So, it's as heavy as it gets on
my workflow, which is pretty heavy, I
think.
And uh let's do some color grading to
show you how this works. And of course,
first things first, I apply a LUT. Well,
technically, I should color grade first,
but uh
we don't do things correctly here.
And we've got LUT. Now, obviously, this
is upside down and I'm going to do a
video about why it's upside down, I
promise. And in position and geometry,
we've got flip, so we can connect flip.
And as you can see, you you can connect
nodes, and you can do stuff, and you can
preview each one, and you got a little
preview of each, and you can still play.
And
well, now it's 25 FPS because I I'm not
uh
giving enough power to this computer and
all that screaming, but normally, it's
like 100 FPS for a couple of nodes on a
6K video, which is great.
Um
and in here, you've got a button to hide
the nodes to actually see what you're
doing.
And um
I don't know, let's do some more stuff,
some I don't know. You You can see
there's a bunch of uh color grading
things. Of course, none of this is
particularly detailed, but hey, at least
it exists. You can even
uh pick up waveform if you'd like to see
what you're doing to to the stuff, and
uh let's add some gamma,
bring down the lift, something like
this, you know.
Um
random color grading. I could also add a
vignette to cuz this is already quite
vignette, so
I can Yeah, I'll show you. I can balance
it out like this.
And yeah, now it's much better.
This is what we got. This is how we
started. And all of this in a node-like
interface which which is cool,
objectively.
And you can do even more complex stuff
if it works, and it might not work.
Again, a couple of weeks of development,
but position and geometry, we can also
move things around.
We've got a lot of transforms.
And um as an example, let's move this
6,000 pixels to the right. And of
course, uh this is a new node, so it's
going to get to a different branch. And
we can merge this together to see like
the before and after with a group
element. And
we've got one element here and one
element here.
And just like this,
voilà, before and after.
All in a node-like application. And you
can play this. Of course, it's going to
lag because now it's a 12K video.
That's a lot.
But yeah, how many 10 FPS? But I promise
you actually get more FPS normally.
And the cool thing
is that
well, after doing all of this, you could
say, "Well, I don't actually need 12K of
resolution." So, you can scale this down
to something smaller. Actually, let's
resize
because this
resize node has less bugs.
And
we can bring this down
by a factor of like 10. Like this. Now
it's much smaller resolution, obviously.
And the cool thing is that
each node actually tells the node before
how much resolution is really needed to
be displayed. And so, given that at the
very end, we resize to a very small
thing,
well, each node now knows that it's not
necessary to actually render a 6K
texture because we don't need that.
And the cool thing is that normally you
would need this at the very start
because otherwise everything would be
6K.
But
in here, you can just have it at the end
and it's still retroactively
going to work. And the cool thing is
that all of the textures are still going
to think they're in 6K. All the
coordinates, all the transforms, you can
still see that this is 6K and it it
still thinks it's in 6K, but actually
it's been rendered in
you know, 600 pixels by 400. And this
should improve performances.
Yeah. As you can see, we get the same
thing as before, but 100 FPS instead of
10.
And so, I think that's cool.
Isn't it cool?
And you can save things. I can save
this.
And I'll just save it to the home as
test.qml, which should exist.
And you might
might ask, "Okay, but what does the save
file look like?" So, let's bring it up.
Actually, let's
open a new instance of Kate
like this, and let's open this file.
And so, what this file looks like is a
normal QML file. Now, if you've never
worked with QML,
that's fine. It's a markup language, a
bit like HTML.
Um and so, you've got an item, which is
just a container, and then we've got our
video.
And then there's the loot and the flip
and uh flip flip the things. And each
node has all of the relevant settings in
it, which is exposed in a human-readable
interface. And the cool thing is that
I'm not going to do it right now, but
QML files technically are applications,
like you could run them as applications.
And if you do run this QML file as an
application, you're going to get
this
without the UI, just the result.
Because it's an actual
the content is actual content.
And of course, we can also load the
file. Um I can even attempt it. I don't
guarantee that it's going to work
because like
I implemented the loading
like a couple of hours ago, but let's
see if it works.
And does it get now?
Yeah.
It worked.
Uh
yeah, a bit bigger, yeah.
That works.
So,
that's a bunch of cool things that I've
shown you, I think. We You already have
You could already do a lot of things. Um
especially because let's quickly go
through the the nodes that we have in
two of them.
Let's start it again. Okay.
So,
what do we have here? Uh let's close
this stuff.
So, I've shown you a video, but we can
also do images, obviously, and we can
also do raw images. And this is actually
going to load the raw image as a 16
float bit
depth file, so you can do all sort of
editing into this. Let's
bring up the exposure as an example.
And yeah.
And this is actually raw image image
editing, which is cool.
Uh what else? We can screen capture
through the normal interface of Wayland,
and that works. Uh you will also be able
to um capture a window, not just the
screen, but right now for some reason
it's broken in KWin, not my fault.
I'm going to fix it if I manage to. And
you've got also camera capture, which I
don't think Oh, yeah, it even works.
This is my computer webcam, and yeah.
That works. That's so cool. And of
course, you can you can still do all the
graphical effects to all of this, like I
don't know, um
I should have
here lens distortion.
And I can do this.
Let's do like like this.
And I can do this.
Which one is cool.
And and you got a lot of effects, and um
you got to clip, which basically takes a
a video. We don't have any video here,
so let's bring up one.
And basically, instead of
having the entire video, you select a
start and duration, and it's going to
clip part of the video. Which means that
you can have like multiple clips, and
then in I guess position and geometry
uh
where was it? No, video elements.
You've got concatenate, and you can
concatenate different videos so that
they play one after another. I'm not
sure if this actually works. Yeah, it
doesn't.
But yeah, that's the idea. Eventually,
this is going to work. Eventually means
like this afternoon, because I'm
disappointed
that it didn't work.
And um
So, what else? Let's still bring our
standard video as a reference.
Uh we've got a bunch of graphical
effects. These one are These are the
most simple ones for now. Saturation,
LUT, exposure, opacity, the contrast,
white balance, vibrance, tone equalizer.
I'm showing you a couple just as as an
example.
I can change the contrast. We can change
the highlights.
Yeah, this looks terrible.
But yeah, you can do all sort of stuff,
and then vignetting. Position and
geometry is all of the transforms,
obviously, flipping, and also grouping
things together.
And there's also compositing, which uh
should probably be called blending. I
still don't get the difference, but um
let me show you what this can do.
I mean, I think you know what this can
do, but let me show you again, because
it's cool.
Um camera capture. So, this is my
camera. Um
we can check how big it is with the
resize node,
and it's 1080 by 1920.
And so, actually, let's do that 1080 to
1920 to the video.
So, they are the same size.
And we can
composite them together. Now, normal
it's just this, but I've got darken,
I've got multiply, I've got difference,
color burn. These are all of the ones
that Inkscape supports. I checked. And
um
yeah, they work as you would expect them
to work.
It's pretty cool, isn't it?
Um
and then, of course, you've got the
stuff like perspective, uh lens lens
distortion, and you can mask things.
Let me show you. This is the background,
and um let me bring a rectangle uh as as
a mask.
And we can do this, and this is masking
the size of the rectangle, which is 100
by 100 on the top left. But, uh as I've
shown you, we can move the rectangular
around with a translate
um node,
like this. And we can also move our
masking target around, like this.
Yeah, it works.
And maybe let's make it bigger so you
Yeah.
Yeah, I I didn't um
put a vertical limit to the size of the
nodes, okay? So,
cropping. Uh we've got mask thing. Uh
and this could be any shape.
Let me show you
uh with a more interesting shape. I've
got polygons as well.
Um 500 by 500, like this.
And like this. And voila!
It works.
Uh
yeah.
So, that's cool.
Hello.
Go on. It's cool.
And uh well, I've I've I've begun to
show you this rectangle and polygon
nodes. So,
we've got vector graphic nodes.
And I've started with a rectangle,
circle, circle, circles, and polygons.
And you've got also paths. You can enter
manually a path right now cuz I
as you can see this is entirely node
based for now. There's no editors.
But
you can do stuff like difference
and it's going to do what you expect it
to do or maybe it's not. Why is it not?
Exclusion maybe?
Why didn't this work?
Okay, this one works. I'll double check
the other one. Don't know why.
Never mind.
But yeah,
that works and you can like apply a
gradient to it.
And
you've got your gradient.
And you might say, "Okay, but like this
is low resolution. This is 500 by 500."
But the cool thing is that again, you
can make this bigger. Let's resize this
to
5,000 by 5,000.
And now it's higher quality
even though this is was lower quality
because again,
the same thing as before. These nodes
tell these nodes and tell these nodes
the actual size that we need. And so
even though this polygon and this
rectangle thinks they're 500 by 500,
they are actually asked to render at
5,000.
Retractively.
So,
all transforms my touchpad just died.
Okay, no, it works. So, you know, all
transforms are non-destructive. As an
example, if you take an image, you
resize it to like 10 by 10 pixels and
then you resize it again to the correct
size, you don't lose any quality.
It's non-destructive. If you do want it
to be destruct- destructive, I guess we
can do that somehow, but
it's still cool that you can do it
non-destructively. And uh actually,
let's stick with with rectangles because
I've
got another cool thing to show you,
which is animations. Because yes, we've
got animations as well for vector
graphic elements or anything else,
really.
So, let's animate the rect width
property.
Right now, the number animation is this
weird node that you attach to what you
want to animate. Eventually, I actually
want the UI to be directly within the
node.
But yeah, now we can change the direct
width, and it's going to show us how it
changes. Let's zoom on this.
And and again, we we can still use this
as
anything, so as an example, let's use it
as a mask over my webcam again, like
this.
Voilà.
And now the the
the mask is going to be animated over
time. I can show you.
It animates, and you can pick the
easing curve.
So, that works as well.
Wee!
So, that's cool.
And
I'll show you something more complex,
actually,
which is uh suppose that you do have
two different items that are animated,
like this.
Blah blah blah blah blah blah Now, let's
do the circle height as an example.
And let's do it to 50, like this. Now,
it's going to be animated. And of
course, uh if nodes are not linked
together,
then they animate by themselves. They
are not linked together.
But if you group them together through,
as an example, a union
node,
a path union node,
like this,
uh then yeah, the the rectangle is
absorbing the the the circle, but uh now
they are linked together obviously
because they have
a common parent.
And so they animate together, which is
cool.
Let's do like this so you can actually
see the
Yeah, circle.
And um
You can even
have a delay node that allows one
animation to play after another like
this.
And let's put a delay of 2 and 1/2
seconds. Again, this is only
milliseconds. And now, as you can see
I'm in the latter part of this
animation, but I'm in the beginning of
this one. And there are they are still
synced together because they are they
are part of the same scene.
And you can change the time here. You
can change the time here. You can even
change the time here, and it's going to
apply to both. And this is the full
timeline.
And you can still save
these things, load them
Come on.
Come on. Let me be proud here.
And um
This is actually already a lot of
things.
Let me show you plans for the future.
So, Firefox, please.
Uh this project is currently open
source.
Of course.
And it's part of the of my personal
repository on um
kde.org. Now, this currently is not a
KDE project for the simple reason that
uh
you know you don't get to decide what is
a KDE project like this. There's
actually an application process.
Multiple developers need to be working
on it. So, right now, as you can see,
this is just on my personal page of the
KDE GitLab. But of course, eventually, I
would like this to become a hackaday
project if it works out.
Uh And um
there's a work um items list and these
are the elements that I want to
implement.
And uh
is this would be the elements to
implement for like the very first alpha.
And there's uh 95 of them. And I'm
currently at 46, which
if you think about it, that's pretty
good in a couple of weeks. Sure, they
don't work great,
but you know,
that's something.
And uh you can actually go through this
list. It's public and you can tell me
whether something is missing. You would
like to have more effects, less effects.
I I don't know.
You tell me if I'm missing something.
Now, obviously, there's uh a few things
that are
I need to work on.
Firstly, there's a bit of debugging to
be done
uh on both animations, which uh
worked now, but sometimes uh they don't.
And there's a few bugs to be to be
fixed. Uh so, I'm going to focus on that
and also on the concatenate node, as you
can see as you previously saw, that
doesn't work. So, I'll fix that.
And then there's some cool feature
features. Firstly, uh I need a renderer,
a streamer, and it's missing here, but
also um a recorder. So, basically, um
nodes that
record or render what you give them. So,
uh as you can understand, those are
pretty important if you um you know,
edit a video, you'd like to eventually
render it. And uh a streamer and a
recorder would be for more like OBS type
of things, where you just record what's
happening, not necessarily render it.
Like, you can miss frames and that's
fine.
And the streamer would actually stream
onto YouTube as an example to do live
streams.
So, those are uh a big focus for the
next couple of weeks.
Then, uh another thing that's currently
happening is that this video that you
see here is actually a
Oh, by the way, I forgot to say but at
this point I think you can
understand it. All of this is hardware
accelerated or it wouldn't be running at
all because again, 6K video, but all of
this all of this hardware hardware
accelerated.
This video right now is a QML element
QML video element which works uh as
you've just seen but has some little
issues
uh such as the fact that it uses a lot
of RAM
and it shouldn't.
So, what I was previously doing and what
I will I wanted to be back at doing is
embedding MPV into this.
Um the reason I'm not doing that right
now is that even though it works better
in almost every way, it's slower and I
haven't understood why. It's probably my
fault for how I am embedding I'm
embedding libmpv. So, I'll work on that
but yeah, it's cool that you can
actually play 6K videos at usually it's
120 FPS. Uh and by the way, the video
has 25 FPS so you you wouldn't notice
but still.
Uh what else?
Um
Yeah, audio.
The all of the audio effects are missing
and all of the audio nodes such as audio
capture or audio are missing and that's
because I haven't figured out figured
out how to do audio yet.
I I don't know. I just don't know. I'm
not an audio person either.
Uh
suggestions welcome.
So, that's another things that I'm going
to focus on. Uh I want to finish up all
of the
graphical effects nodes because those
are useful and maybe also like
transitions. Uh, I haven't showed you
but you can also like change the
playback speed of any animation, of any
video playback. And same goes with
invert, which should be called reverse.
I got the name wrong, but you can like
invert an animation. You know, it's all
the things that you you would expect.
And um
Yeah, and and then in the next couple
weeks I'm also going to try to use this
on different GPUs to see how the support
is. Right now, all of this is running on
my integrated Intel GPU from 4 years
ago, which is not good. So, it's
actually impressive that I'm able to get
120 FPS from playback of a 6K video and
still be at 100 FPS after applying two
or three passes of like different color
grading nodes, especially because again,
each node actually creates its own
texture, so you can preview it.
Maybe in the future that can be
optimized.
And uh yeah, probably if I were running
this on my Nvidia
it would be even faster. Maybe.
Currently, there is no code actually
that's specific to Intel GPUs.
It's all handled by cute, interestingly
enough. If I do implement libmpv and if
I do implement recording and rendering
then yeah, probably those are going to
require some custom codes to handle
different GPU, I guess.
So, I'm not looking forward to that. And
by the way,
if you would like to help with this
project,
final part of the video. Firstly, uh
yes, uh if you know how to do recording
and rendering of
QML video QML elements, uh
send me a message. Let's work on this
together. I really don't want to do
this.
So,
I really don't want to reduce myself.
That is.
So, a help would be needed there. And
you can also donate to the channel. You
donate on my
website, which is the the libra.news. I
hope you know about it already. You can
subscribe here and
you get some cool stuff.
Um but yeah, I'm going to work this
regardless of the donations or not. So,
I'm just very in love with the project
as it's going.
I think I've shown you everything.
25 minutes minutes of video.
I mean, what else? Like
Yeah.
I think I've shown you the important
bits.
But yeah, this is like very cool, isn't
it?
Come on.
Come on. Tell me it's cool in the
comments, please, because I've I've
spent
so much time developing this and so much
time thinking of the proper way to
handle time management because you both
have to do a kitty life type of things
where you move things around, but then
you also need to do an OBS type of
things where there are continuously
updating elements.
Uh it took a lot of time to figure this
out and now it works. Actually, let me
show you this.
Um
you even have a playback controller,
which seems stupid, but actually it's a
very smart node.
This node takes a a
a video,
such as this animation,
and as you can see here, down, you
actually have the the playback of the
animation.
The break for some Yeah.
As I told you, there are still some
things to figure out, but we'll get to
that.
But the thing of the
playback controller is it takes
um
a
a a video animation
which you can see the application
recognizes as a video and allows you to
change the time and play it and such.
And then
it give it manages that. So, it allows
you to play it and pause it and move it
around just like the application, but
this element
My computer just died. No.
My touch pad died again. I don't know
why. Okay. And this element is not
uh
considered a video. You can manually
play and pause things, but actually this
is a considered a static element. So,
you can like embed it together with my
basically the equivalent of adding a
video to OBS. It's not going to render
it because it's it's it's OBS.
It's OBS, but it's going to give you the
option to play it, maybe loop it.
I don't know.
This is cool.
Why did it break though?
Yeah.
That's all folks for this week's devlog
and
follow this channel if you want to see
more and learn more about this weird
project of mine.
I would argue I'm doing a good job.
Let's stop this.