Skip to content

Commit 545e97f

Browse files
committed
Add AVFifo
1 parent 0d5f8cb commit 545e97f

File tree

13 files changed

+1826
-19
lines changed

13 files changed

+1826
-19
lines changed

binding-jellyfin.gyp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
"src/bindings/audio_fifo.cc",
5252
"src/bindings/audio_fifo_async.cc",
5353
"src/bindings/audio_fifo_sync.cc",
54+
"src/bindings/fifo.cc",
55+
"src/bindings/fifo_async.cc",
56+
"src/bindings/fifo_sync.cc",
5457
"src/bindings/frame_utils.cc",
5558
"src/bindings/bitstream_filter.cc",
5659
"src/bindings/bitstream_filter_context.cc",

binding-msvc.gyp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
"src/bindings/audio_fifo.cc",
5252
"src/bindings/audio_fifo_async.cc",
5353
"src/bindings/audio_fifo_sync.cc",
54+
"src/bindings/fifo.cc",
55+
"src/bindings/fifo_async.cc",
56+
"src/bindings/fifo_sync.cc",
5457
"src/bindings/frame_utils.cc",
5558
"src/bindings/bitstream_filter.cc",
5659
"src/bindings/bitstream_filter_context.cc",

binding.gyp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
"src/bindings/audio_fifo.cc",
5252
"src/bindings/audio_fifo_async.cc",
5353
"src/bindings/audio_fifo_sync.cc",
54+
"src/bindings/fifo.cc",
55+
"src/bindings/fifo_async.cc",
56+
"src/bindings/fifo_sync.cc",
5457
"src/bindings/frame_utils.cc",
5558
"src/bindings/bitstream_filter.cc",
5659
"src/bindings/bitstream_filter_context.cc",

src/bindings/fifo.cc

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
#include "fifo.h"
2+
#include "common.h"
3+
4+
extern "C" {
5+
#include <libavutil/mem.h>
6+
#include <libavutil/fifo.h>
7+
}
8+
9+
namespace ffmpeg {
10+
11+
Napi::FunctionReference Fifo::constructor;
12+
13+
Napi::Object Fifo::Init(Napi::Env env, Napi::Object exports) {
14+
Napi::Function func = DefineClass(env, "Fifo", {
15+
InstanceMethod<&Fifo::Alloc>("alloc"),
16+
InstanceMethod<&Fifo::Free>("free"),
17+
InstanceMethod<&Fifo::WriteAsync>("write"),
18+
InstanceMethod<&Fifo::WriteSync>("writeSync"),
19+
InstanceMethod<&Fifo::ReadAsync>("read"),
20+
InstanceMethod<&Fifo::ReadSync>("readSync"),
21+
InstanceMethod<&Fifo::PeekAsync>("peek"),
22+
InstanceMethod<&Fifo::PeekSync>("peekSync"),
23+
InstanceMethod<&Fifo::Grow>("grow"),
24+
InstanceMethod<&Fifo::Reset>("reset"),
25+
InstanceMethod<&Fifo::SetAutoGrowLimit>("setAutoGrowLimit"),
26+
InstanceMethod(Napi::Symbol::WellKnown(env, "dispose"), &Fifo::Dispose),
27+
28+
InstanceAccessor<&Fifo::GetSize>("size"),
29+
InstanceAccessor<&Fifo::GetCanRead>("canRead"),
30+
InstanceAccessor<&Fifo::GetCanWrite>("canWrite"),
31+
InstanceAccessor<&Fifo::GetElemSize>("elemSize"),
32+
});
33+
34+
constructor = Napi::Persistent(func);
35+
constructor.SuppressDestruct();
36+
37+
exports.Set("Fifo", func);
38+
return exports;
39+
}
40+
41+
Fifo::Fifo(const Napi::CallbackInfo& info)
42+
: Napi::ObjectWrap<Fifo>(info) {
43+
// Constructor does nothing - user must explicitly call alloc()
44+
}
45+
46+
Fifo::~Fifo() {
47+
// Manual cleanup if not already done
48+
if (fifo_) {
49+
av_fifo_freep2(&fifo_);
50+
}
51+
}
52+
53+
Napi::Value Fifo::Alloc(const Napi::CallbackInfo& info) {
54+
Napi::Env env = info.Env();
55+
56+
if (info.Length() < 2) {
57+
Napi::TypeError::New(env, "Expected 2 or 3 arguments (nb_elems, elem_size, [flags])").ThrowAsJavaScriptException();
58+
return env.Undefined();
59+
}
60+
61+
// Free old fifo if exists
62+
if (fifo_) {
63+
av_fifo_freep2(&fifo_);
64+
}
65+
66+
size_t nb_elems = static_cast<size_t>(info[0].As<Napi::Number>().Int64Value());
67+
size_t elem_size = static_cast<size_t>(info[1].As<Napi::Number>().Int64Value());
68+
unsigned int flags = 0;
69+
70+
if (info.Length() >= 3) {
71+
flags = info[2].As<Napi::Number>().Uint32Value();
72+
}
73+
74+
fifo_ = av_fifo_alloc2(nb_elems, elem_size, flags);
75+
76+
if (!fifo_) {
77+
Napi::Error::New(env, "Failed to allocate Fifo").ThrowAsJavaScriptException();
78+
return env.Undefined();
79+
}
80+
81+
return env.Undefined();
82+
}
83+
84+
Napi::Value Fifo::Free(const Napi::CallbackInfo& info) {
85+
Napi::Env env = info.Env();
86+
87+
if (fifo_) {
88+
av_fifo_freep2(&fifo_);
89+
}
90+
91+
return env.Undefined();
92+
}
93+
94+
Napi::Value Fifo::Grow(const Napi::CallbackInfo& info) {
95+
Napi::Env env = info.Env();
96+
97+
if (!fifo_) {
98+
Napi::Error::New(env, "Fifo not allocated").ThrowAsJavaScriptException();
99+
return Napi::Number::New(env, AVERROR(EINVAL));
100+
}
101+
102+
if (info.Length() < 1) {
103+
Napi::TypeError::New(env, "Expected 1 argument (inc)").ThrowAsJavaScriptException();
104+
return Napi::Number::New(env, AVERROR(EINVAL));
105+
}
106+
107+
size_t inc = static_cast<size_t>(info[0].As<Napi::Number>().Int64Value());
108+
int ret = av_fifo_grow2(fifo_, inc);
109+
110+
return Napi::Number::New(env, ret);
111+
}
112+
113+
Napi::Value Fifo::Reset(const Napi::CallbackInfo& info) {
114+
Napi::Env env = info.Env();
115+
116+
if (!fifo_) {
117+
Napi::Error::New(env, "Fifo not allocated").ThrowAsJavaScriptException();
118+
return env.Undefined();
119+
}
120+
121+
av_fifo_reset2(fifo_);
122+
123+
return env.Undefined();
124+
}
125+
126+
Napi::Value Fifo::SetAutoGrowLimit(const Napi::CallbackInfo& info) {
127+
Napi::Env env = info.Env();
128+
129+
if (!fifo_) {
130+
Napi::Error::New(env, "Fifo not allocated").ThrowAsJavaScriptException();
131+
return env.Undefined();
132+
}
133+
134+
if (info.Length() < 1) {
135+
Napi::TypeError::New(env, "Expected 1 argument (max_elems)").ThrowAsJavaScriptException();
136+
return env.Undefined();
137+
}
138+
139+
size_t max_elems = static_cast<size_t>(info[0].As<Napi::Number>().Int64Value());
140+
av_fifo_auto_grow_limit(fifo_, max_elems);
141+
142+
return env.Undefined();
143+
}
144+
145+
Napi::Value Fifo::GetSize(const Napi::CallbackInfo& info) {
146+
Napi::Env env = info.Env();
147+
148+
if (!fifo_) {
149+
return Napi::Number::New(env, 0);
150+
}
151+
152+
return Napi::Number::New(env, static_cast<double>(av_fifo_can_read(fifo_)));
153+
}
154+
155+
Napi::Value Fifo::GetCanRead(const Napi::CallbackInfo& info) {
156+
Napi::Env env = info.Env();
157+
158+
if (!fifo_) {
159+
return Napi::Number::New(env, 0);
160+
}
161+
162+
return Napi::Number::New(env, static_cast<double>(av_fifo_can_read(fifo_)));
163+
}
164+
165+
Napi::Value Fifo::GetCanWrite(const Napi::CallbackInfo& info) {
166+
Napi::Env env = info.Env();
167+
168+
if (!fifo_) {
169+
return Napi::Number::New(env, 0);
170+
}
171+
172+
return Napi::Number::New(env, static_cast<double>(av_fifo_can_write(fifo_)));
173+
}
174+
175+
Napi::Value Fifo::GetElemSize(const Napi::CallbackInfo& info) {
176+
Napi::Env env = info.Env();
177+
178+
if (!fifo_) {
179+
return Napi::Number::New(env, 0);
180+
}
181+
182+
return Napi::Number::New(env, static_cast<double>(av_fifo_elem_size(fifo_)));
183+
}
184+
185+
Napi::Value Fifo::Dispose(const Napi::CallbackInfo& info) {
186+
return Free(info);
187+
}
188+
189+
} // namespace ffmpeg

src/bindings/fifo.h

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#ifndef FFMPEG_FIFO_H
2+
#define FFMPEG_FIFO_H
3+
4+
#include <napi.h>
5+
#include "common.h"
6+
7+
extern "C" {
8+
#include <libavutil/fifo.h>
9+
}
10+
11+
namespace ffmpeg {
12+
13+
class Fifo : public Napi::ObjectWrap<Fifo> {
14+
public:
15+
static Napi::Object Init(Napi::Env env, Napi::Object exports);
16+
Fifo(const Napi::CallbackInfo& info);
17+
~Fifo();
18+
19+
AVFifo* Get() { return fifo_; }
20+
21+
private:
22+
static Napi::FunctionReference constructor;
23+
24+
AVFifo* fifo_ = nullptr;
25+
26+
Napi::Value Alloc(const Napi::CallbackInfo& info);
27+
Napi::Value Free(const Napi::CallbackInfo& info);
28+
Napi::Value WriteAsync(const Napi::CallbackInfo& info);
29+
Napi::Value WriteSync(const Napi::CallbackInfo& info);
30+
Napi::Value ReadAsync(const Napi::CallbackInfo& info);
31+
Napi::Value ReadSync(const Napi::CallbackInfo& info);
32+
Napi::Value PeekAsync(const Napi::CallbackInfo& info);
33+
Napi::Value PeekSync(const Napi::CallbackInfo& info);
34+
Napi::Value Grow(const Napi::CallbackInfo& info);
35+
Napi::Value Reset(const Napi::CallbackInfo& info);
36+
Napi::Value SetAutoGrowLimit(const Napi::CallbackInfo& info);
37+
Napi::Value Dispose(const Napi::CallbackInfo& info);
38+
39+
Napi::Value GetSize(const Napi::CallbackInfo& info);
40+
Napi::Value GetCanRead(const Napi::CallbackInfo& info);
41+
Napi::Value GetCanWrite(const Napi::CallbackInfo& info);
42+
Napi::Value GetElemSize(const Napi::CallbackInfo& info);
43+
};
44+
45+
} // namespace ffmpeg
46+
47+
#endif // FFMPEG_FIFO_H

0 commit comments

Comments
 (0)