summaryrefslogtreecommitdiff
path: root/src/codec
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec')
-rw-r--r--src/codec/ffmpeg/decoder.c2
-rw-r--r--src/codec/ffmpeg/demuxer.c3
-rw-r--r--src/codec/ffmpeg/meson.build16
-rw-r--r--src/codec/ffmpeg/packet_ext.c3
-rw-r--r--src/codec/meson.build6
-rw-r--r--src/codec/packet_ext.c15
-rw-r--r--src/codec/packet_ext.h8
7 files changed, 44 insertions, 9 deletions
diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c
index a6431b1..17be6cc 100644
--- a/src/codec/ffmpeg/decoder.c
+++ b/src/codec/ffmpeg/decoder.c
@@ -3,7 +3,7 @@
#include <al/lib.h>
#include <libavutil/cpu.h>
-#ifndef CAMU_SINK_NO_VIDEO
+#if !defined CAMU_SINK_NO_VIDEO && defined CAMU_FF_DECODER_HWACCEL
#include "../../render/renderer.h"
#endif
diff --git a/src/codec/ffmpeg/demuxer.c b/src/codec/ffmpeg/demuxer.c
index 058a423..b612b2d 100644
--- a/src/codec/ffmpeg/demuxer.c
+++ b/src/codec/ffmpeg/demuxer.c
@@ -14,7 +14,7 @@ static void close_internal(struct camu_ff_demuxer *av)
if (av->format_context) {
avformat_flush(av->format_context);
avformat_close_input(&av->format_context);
- avformat_free_context(av->format_context);
+ // avformat_close_input() should call avformat_free_context().
}
}
@@ -105,6 +105,7 @@ static bool ff_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handl
.mode = CAMU_FFMPEG_COMPAT,
.type = type,
.duration = duration,
+ .index = stream->index,
.av.stream = stream
}));
}
diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build
index dfbf624..eb68fad 100644
--- a/src/codec/ffmpeg/meson.build
+++ b/src/codec/ffmpeg/meson.build
@@ -12,9 +12,6 @@ ffmpeg_server_src = [
]
ffmpeg_server_deps = []
-# This is layed out based on how things work currently.
-# Obviously the decoder, resampler, scaler, and encoder should
-# be a part of a server-side transcoding function.
ffmpeg_client_src = [
ffmpeg_src,
'decoder.c',
@@ -24,6 +21,16 @@ ffmpeg_client_src = [
]
ffmpeg_client_deps = []
+server_transcode = not get_option('sink-only')
+if server_transcode
+ ffmpeg_server_src += [
+ 'decoder.c',
+ 'resampler.c',
+ 'scaler.c',
+ 'encoder.c'
+ ]
+endif
+
libavutil = dependency('libavutil', required: false)
libavformat = dependency('libavformat', required: false)
libavcodec = dependency('libavcodec', required: false)
@@ -60,6 +67,9 @@ if libavutil.found() and libavformat.found() and libavcodec.found() and libswres
# This is probably meaningless compared to libav* versions, it's just something I wanted.
ffmpeg_args += ['-DFFMPEG_VERSION="' + ffmpeg_version_string + '"']
ffmpeg_server_deps += [libavutil, libavformat, libavcodec]
+ if server_transcode
+ ffmpeg_server_deps += [libswresample, libswscale]
+ endif
ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
soxr = compiler.find_library('soxr', required: false)
if soxr.found()
diff --git a/src/codec/ffmpeg/packet_ext.c b/src/codec/ffmpeg/packet_ext.c
index e7b1da8..acf5bbd 100644
--- a/src/codec/ffmpeg/packet_ext.c
+++ b/src/codec/ffmpeg/packet_ext.c
@@ -165,8 +165,7 @@ void nn_packet_read_av_dictionary(struct nn_packet *packet, AVDictionary **dict)
u32 len;
NNWT_PACKET_READ_TYPE(packet, u32, len);
NNWT_PACKET_READ_DATA(packet, len, key);
- // Key and value MUST be allocated with av_malloc functions,
- // just like all FFmpeg structures.
+ // Key and value MUST be allocated with av_malloc functions.
key = av_strndup(key, len);
NNWT_PACKET_READ_TYPE(packet, u32, len);
NNWT_PACKET_READ_DATA(packet, len, value);
diff --git a/src/codec/meson.build b/src/codec/meson.build
index 4c9e16b..a739de0 100644
--- a/src/codec/meson.build
+++ b/src/codec/meson.build
@@ -1,3 +1,5 @@
+codec_src = ['packet_ext.c']
+
codec_server_deps = []
codec_client_deps = []
@@ -21,5 +23,5 @@ if not no_video
codec_client_deps += [stela]
endif
-codecs_server = declare_dependency(dependencies: codec_server_deps)
-codecs_client = declare_dependency(dependencies: codec_client_deps)
+codecs_server = declare_dependency(sources: codec_src, dependencies: codec_server_deps)
+codecs_client = declare_dependency(sources: codec_src, dependencies: codec_client_deps)
diff --git a/src/codec/packet_ext.c b/src/codec/packet_ext.c
new file mode 100644
index 0000000..c41eadb
--- /dev/null
+++ b/src/codec/packet_ext.c
@@ -0,0 +1,15 @@
+#include "packet_ext.h"
+
+void nn_packet_write_audio_format(struct nn_packet *packet, struct camu_audio_format *fmt)
+{
+ NNWT_PACKET_WRITE_TYPE(packet, s32, fmt->format);
+ NNWT_PACKET_WRITE_TYPE(packet, s32, fmt->sample_rate);
+ NNWT_PACKET_WRITE_TYPE(packet, s32, fmt->channel_count);
+}
+
+void nn_packet_read_audio_format(struct nn_packet *packet, struct camu_audio_format *fmt)
+{
+ NNWT_PACKET_READ_TYPE(packet, s32, fmt->format);
+ NNWT_PACKET_READ_TYPE(packet, s32, fmt->sample_rate);
+ NNWT_PACKET_READ_TYPE(packet, s32, fmt->channel_count);
+}
diff --git a/src/codec/packet_ext.h b/src/codec/packet_ext.h
new file mode 100644
index 0000000..6bf1b56
--- /dev/null
+++ b/src/codec/packet_ext.h
@@ -0,0 +1,8 @@
+#pragma once
+
+#include <nnwt/packet.h>
+
+#include "codec.h"
+
+void nn_packet_write_audio_format(struct nn_packet *packet, struct camu_audio_format *fmt);
+void nn_packet_read_audio_format(struct nn_packet *packet, struct camu_audio_format *fmt);