summaryrefslogtreecommitdiff
path: root/src/codec/ffmpeg
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec/ffmpeg')
-rw-r--r--src/codec/ffmpeg/decoder.c8
-rw-r--r--src/codec/ffmpeg/meson.build70
2 files changed, 76 insertions, 2 deletions
diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c
index 36e59dd..5ff99d7 100644
--- a/src/codec/ffmpeg/decoder.c
+++ b/src/codec/ffmpeg/decoder.c
@@ -2,9 +2,13 @@
#include <al/log.h>
#include <libavutil/cpu.h>
+#ifndef CAMU_SINK_NO_VIDEO
+#include "../../render/renderer.h"
+#endif
+
#include "decoder.h"
-#if !defined CAMU_SINK_NO_VIDEO
+#ifndef CAMU_SINK_NO_VIDEO
static s32 get_buffer2(AVCodecContext *context, AVFrame *pic, s32 flags)
{
struct camu_ff_decoder *av = (struct camu_ff_decoder *)context->opaque;
@@ -236,7 +240,7 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
}
#endif
-#if !defined CAMU_SINK_NO_VIDEO
+#ifndef CAMU_SINK_NO_VIDEO
if (codecpar->codec_type == AVMEDIA_TYPE_VIDEO && renderer && renderer->get_buffer2) {
av->renderer = renderer;
av->codec_context->opaque = av;
diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build
new file mode 100644
index 0000000..fc0bc91
--- /dev/null
+++ b/src/codec/ffmpeg/meson.build
@@ -0,0 +1,70 @@
+ffmpeg_src = [
+ 'common.c',
+ 'packet_ext.c',
+]
+ffmpeg_args = ['-DCAMU_HAVE_FFMPEG']
+ffmpeg_deps = []
+
+ffmpeg_server_src = [
+ ffmpeg_src,
+ 'demuxer.c',
+ 'avio.c'
+]
+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',
+ 'resampler.c',
+ 'scaler.c',
+ 'encoder.c'
+]
+ffmpeg_client_deps = []
+
+libavutil = dependency('libavutil', required: false)
+libavformat = dependency('libavformat', required: false)
+libavcodec = dependency('libavcodec', required: false)
+libswresample = dependency('libswresample', required: false)
+libswscale = dependency('libswscale', required: false)
+if not (libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found())
+ ffmpeg_proj = subproject('ffmpeg', required: false)
+ if ffmpeg_proj.found()
+ libavutil = ffmpeg_proj.get_variable('avutil')
+ libavformat = ffmpeg_proj.get_variable('avformat')
+ libavcodec = ffmpeg_proj.get_variable('avcodec')
+ libswresample = ffmpeg_proj.get_variable('swresample')
+ libswscale = ffmpeg_proj.get_variable('swscale')
+ # Only used to set include dirs for FFmpeg.
+ ffmpeg_deps += [ffmpeg_proj.get_variable('ffmpeg_inc_dep')]
+ # We explicitly enable zlib in the FFmpeg build.
+ ffmpeg_deps += [dependency('zlib')]
+ if is_windows
+ # Extra static dependencies for Windows.
+ ffmpeg_client_deps += [compiler.find_library('bcrypt')]
+ elif is_android
+ # Android MediaCodec HW decoding.
+ ffmpeg_client_deps += [compiler.find_library('mediandk')]
+ endif
+ soxr = compiler.find_library('soxr', required: false)
+ if soxr.found()
+ ffmpeg_client_deps += [soxr]
+ ffmpeg_args += ['-DCAMU_HAVE_SOXR']
+ endif
+ endif
+endif
+
+if libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found()
+ ffmpeg_server_deps += [libavutil, libavformat, libavcodec]
+ ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
+ codec_server_deps += [
+ declare_dependency(sources: ffmpeg_server_src,
+ dependencies: [ffmpeg_deps, ffmpeg_server_deps], compile_args: ffmpeg_args)
+ ]
+ codec_client_deps += [
+ declare_dependency(sources: ffmpeg_client_src,
+ dependencies: [ffmpeg_deps, ffmpeg_client_deps], compile_args: ffmpeg_args)
+ ]
+endif