From d81a4b741777ed247f1de5119e3bd0fc918843cd Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Tue, 28 Apr 2026 15:03:03 +0200 Subject: [PATCH] ffmpeg support on linux, and check compiled vs. runtime versions of ffmpeg --- .gitignore | 1 + Makefile | 19 ++-- ao-play-async/ao_playasync.c | 159 ++++++++++++++++++++++++++++--- ao-play-async/ao_playasync.h | 1 + ffmpeg-audio/CMakeLists.txt | 2 + ffmpeg-audio/demo_ffmpeg_audio.c | 12 +++ ffmpeg-audio/ffmpeg_audio.cpp | 126 +++++++++++++++++++++--- ffmpeg-audio/ffmpeg_audio.h | 4 + lib/linux-x86_64.zip | Bin 667862 -> 689931 bytes 9 files changed, 289 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 0162613..bbb7395 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ build lib/linux-x86_64 +build-ffmpeg /ffmpeg-audio/.qtcreator diff --git a/Makefile b/Makefile index 34b5dce..9e178db 100644 --- a/Makefile +++ b/Makefile @@ -1,28 +1,27 @@ +SUBDIR := $(shell racket -e "(display (format \"~a-~a\" (system-type 'os*) (system-type 'arch)))") all: mkdir -p build cmake -S ao-play-async -B build (cd build; make) + cmake -S ffmpeg-audio -B build-ffmpeg + (cd build-ffmpeg; make) install: all - SUBDIR=`racket -e "(display (format \"~a-~a\" (system-type 'os*) (system-type 'arch)))"`; \ - mkdir -p lib/$$SUBDIR - SUBDIR=`racket -e "(display (format \"~a-~a\" (system-type 'os*) (system-type 'arch)))"`; \ - FILES=`ls build/*.so` 2>/dev/null; if [ "$$FILES" != "" ]; then cp $$FILES lib/$$SUBDIR; fi - SUBDIR=`racket -e "(display (format \"~a-~a\" (system-type 'os*) (system-type 'arch)))"`; \ - FILES=`ls build/*.dll` 2>/dev/null; if [ "$$FILES" != "" ]; then cp $$FILES lib/$$SUBDIR; fi + mkdir -p lib/$(SUBDIR) + FILES=`ls build/*.so build-ffmpeg/*.so` 2>/dev/null; if [ "$$FILES" != "" ]; then cp $$FILES lib/$(SUBDIR); fi + FILES=`ls build/*.dll build-ffmpeg/*.dll` 2>/dev/null; if [ "$$FILES" != "" ]; then cp $$FILES lib/$(SUBDIR); fi test: install cp lib/linux-x86_64/*.so ~/.local/share/racket/racket-sound-lib/linux-x86_64 zip: install - SUBDIR=`racket -e "(display (format \"~a-~a\" (system-type 'os*) (system-type 'arch)))"`; \ - (cd lib; zip -y -r -9 $$SUBDIR.zip $$SUBDIR) - SUBDIR=`racket -e "(display (format \"~a-~a\" (system-type 'os*) (system-type 'arch)))"`; \ - (cd lib; rm -rf $$SUBDIR) + (cd lib; zip -y -r -9 $(SUBDIR).zip $(SUBDIR)) + (cd lib; rm -rf $(SUBDIR)) clean: rm -rf build + rm -rf build-ffmpeg diff --git a/ao-play-async/ao_playasync.c b/ao-play-async/ao_playasync.c index b55e36c..9e1b113 100644 --- a/ao-play-async/ao_playasync.c +++ b/ao-play-async/ao_playasync.c @@ -100,7 +100,7 @@ typedef struct _queue_ { struct _queue_ *prev; } Queue_t; -typedef int(*ao_play_func_t)(void *, char *, uint32_t); +struct AO_Handle; typedef struct { Queue_t *play_queue; @@ -109,6 +109,7 @@ typedef struct { int paused; ao_device *ao_device; + int requested_bits_per_sample; int dev_bits_per_sample; int dev_endianess; int dev_channels; @@ -348,9 +349,131 @@ static void init_ao() if (!init) { ao_initialize(); atexit(at_exit_shutdown_ao); + init = 1; } } + +static ao_device *try_open_device(int bits, int rate, int channels, int byte_format, + const char *wav_file_output, + int *opened_bits) +{ + int candidates[3]; + int n = 0; + + candidates[n++] = bits; + + if (bits > 24) candidates[n++] = 24; + if (bits > 16) candidates[n++] = 16; + + for (int i = 0; i < n; i++) { + ao_sample_format fmt; + fmt.bits = candidates[i]; + fmt.rate = rate; + fmt.byte_format = byte_format; + fmt.channels = channels; + fmt.matrix = NULL; + + ao_device *dev; + + if (wav_file_output != NULL) { + int driver_id = ao_driver_id("wav"); + dev = ao_open_file(driver_id, wav_file_output, 1, &fmt, NULL); + } else { + dev = ao_open_live(ao_default_driver_id(), &fmt, NULL); + } + + if (dev != NULL) { + *opened_bits = candidates[i]; + return dev; + } + } + + return NULL; +} + + +static inline int32_t convert_bits(int32_t sample, int req_bits, int out_bits) +{ + if (req_bits > out_bits) { + sample >>= (req_bits - out_bits); + } else if (req_bits < out_bits) { + sample <<= (out_bits - req_bits); + } + return sample; +} + +static inline int32_t read_sample(unsigned char *mem, int req_bytes, int little_endian) +{ + uint32_t v = 0; + + for (int i = 0; i < req_bytes; i++) { + int idx = little_endian ? i : (req_bytes - i - 1); + v |= ((uint32_t) mem[idx]) << (8 * i); + } + + if (req_bytes < 4) { + int bits = req_bytes * 8; + uint32_t sign = 1u << (bits - 1); + v = (v ^ sign) - sign; + } + + return (int32_t) v; +} + +static inline void store_sample(unsigned char *dst, int32_t sample, int out_bytes, int is_little_endian) +{ + for (int i = 0; i < out_bytes; i++) { + int idx = is_little_endian ? i : (out_bytes - i - 1); + dst[idx] = sample & 0xff; + sample >>= 8; + } +} + +static void *convert_req_to_real(AO_Handle *h, void *mem, int mem_size, BufferInfo_t *info, int *out_size) +{ + int endianess = h->dev_endianess; + int little_endian = (endianess == AO_FMT_LITTLE); + if (!little_endian && endianess == AO_FMT_NATIVE) little_endian = littleEndian(); + + int requested_bits = h->requested_bits_per_sample; + int output_bits = h->dev_bits_per_sample; + + int req_bytes = (requested_bits / 8); + int out_bytes = (output_bits / 8); + + int samples = (mem_size / req_bytes); + + unsigned char *buf_out = (unsigned char *) malloc(samples * out_bytes); + if (buf_out == NULL) { + fprintf(stderr, "Allocation of output buffer of %d samples of %d bits gives NULL", samples, output_bits); + *out_size = 0; + return NULL; + } + + if (requested_bits == output_bits) { + *out_size = mem_size; + memcpy(buf_out, mem, mem_size); + } else { + // convert samples. + + int sample; + unsigned char *p_in = (unsigned char *) mem; + unsigned char *p_out = buf_out; + + for(sample = 0; sample < samples; sample++, p_in += req_bytes, p_out += out_bytes) { + register int32_t smpl; + smpl = read_sample(p_in, req_bytes, little_endian); + int32_t out_smpl = convert_bits(smpl, requested_bits, output_bits); + store_sample(p_out, out_smpl, out_bytes, little_endian); + } + + *out_size = samples * out_bytes; + } + + return buf_out; +} + void *ao_create_async(int bits, int rate, int channels, int byte_format, const char *wav_file_output) { init_ao(); @@ -364,21 +487,18 @@ void *ao_create_async(int bits, int rate, int channels, int byte_format, const c fmt.channels = channels; fmt.matrix = NULL; - ao_device *dev; - if (wav_file_output != NULL) { - int driver_id = ao_driver_id("wav"); - dev = ao_open_file(driver_id, wav_file_output, 1, &fmt, NULL); - } else { - dev = ao_open_live(ao_default_driver_id(), &fmt, NULL); - } + int opened_bits = 0; + ao_device *dev = try_open_device(bits, rate, channels, byte_format, wav_file_output, &opened_bits); if (dev == NULL) { fprintf(stderr, "Cannot open ao-device, error code = %d\n", errno); + free(handle); return NULL; } handle->ao_device = dev; - handle->dev_bits_per_sample = bits; + handle->requested_bits_per_sample = bits; + handle->dev_bits_per_sample = opened_bits; handle->dev_channels = channels; handle->dev_rate = rate; handle->dev_endianess = byte_format; @@ -563,12 +683,23 @@ void ao_play_async(void *ao_handle, int music_id, double at_second, double music case flac: { int store_size = 0; void *store_mem = convertFlac(mem, buf_size, &info, &store_size); - q = new_elem(PLAY, music_id, at_second, music_duration, store_size, store_mem); + + int ao_size = 0; + void *ao_mem = convert_req_to_real(ao_handle, store_mem, store_size, &info, &ao_size); + + q = new_elem(PLAY, music_id, at_second, music_duration, ao_size, ao_mem); + free(store_mem); + free(ao_mem); } break; case ao: { - q = new_elem(PLAY, music_id, at_second, music_duration, buf_size, mem); + int ao_size = 0; + void *ao_mem = convert_req_to_real(ao_handle, mem, buf_size, &info, &ao_size); + + q = new_elem(PLAY, music_id, at_second, music_duration, ao_size, ao_mem); + + free(ao_mem); } break; case mpg123: { @@ -680,3 +811,9 @@ void ao_pause_async(void *ao_handle, int paused) + +int ao_real_output_bits_async(void *handle) +{ + AO_Handle *h = (AO_Handle *) handle; + return h->dev_bits_per_sample; +} diff --git a/ao-play-async/ao_playasync.h b/ao-play-async/ao_playasync.h index 022fbdd..08c79d5 100644 --- a/ao-play-async/ao_playasync.h +++ b/ao-play-async/ao_playasync.h @@ -44,5 +44,6 @@ AOPLAYASYNC_EXPORT void ao_set_volume_async(void *ao_handle, double percentage); AOPLAYASYNC_EXPORT double ao_volume_async(void *ao_handle); AOPLAYASYNC_EXPORT int ao_bufsize_async(void *handle); +AOPLAYASYNC_EXPORT int ao_real_output_bits_async(void *handle); #endif // AO_PLAYASYNC_H diff --git a/ffmpeg-audio/CMakeLists.txt b/ffmpeg-audio/CMakeLists.txt index 7080a2a..229f987 100644 --- a/ffmpeg-audio/CMakeLists.txt +++ b/ffmpeg-audio/CMakeLists.txt @@ -21,6 +21,8 @@ if(WIN32) target_link_directories(ffmpeg_audio PRIVATE ${FFMPEG_LIB}) set(FFMPEG_LIBRARIES avcodec.lib avformat.lib swresample.lib avutil.lib avdevice.lib avfilter.lib swscale.lib) target_link_directories(demo_ffmpeg_audio PRIVATE ${FFMPEG_LIB}) +else() + set(FFMPEG_LIBRARIES avcodec avformat swresample avutil avdevice avfilter swscale) endif() target_link_libraries(ffmpeg_audio PRIVATE ${FFMPEG_LIBRARIES}) diff --git a/ffmpeg-audio/demo_ffmpeg_audio.c b/ffmpeg-audio/demo_ffmpeg_audio.c index 4ecbe46..e1bf417 100644 --- a/ffmpeg-audio/demo_ffmpeg_audio.c +++ b/ffmpeg-audio/demo_ffmpeg_audio.c @@ -4,6 +4,13 @@ #include #include +#include +#include +#include +#include +#include +#include + #ifdef WIN32 #define fprintf fprintf_s #endif @@ -97,6 +104,11 @@ int main(int argc, char **argv) infile = argv[1]; outfile = argv[2]; + fprintf(stderr, "ffmpeg compiled version: %s\n", fmpg_ffmpeg_version()); + fprintf(stderr, "ffmpeg runtime version avformat: %d - %s\n", avformat_version(), fmpg_int_version2string(avformat_version())); + + //fprintf(stderr, "ffmpeg runtme config string: %s\n", avformat_configuration()); + fmpg = fmpg_init(); if (!fmpg) { fprintf(stderr, "fmpg_init failed\n"); diff --git a/ffmpeg-audio/ffmpeg_audio.cpp b/ffmpeg-audio/ffmpeg_audio.cpp index c4fe23e..589f9ab 100644 --- a/ffmpeg-audio/ffmpeg_audio.cpp +++ b/ffmpeg-audio/ffmpeg_audio.cpp @@ -31,6 +31,21 @@ extern "C" { #include } +#define MSG0(type, msg) fprintf(stderr, type ":");fprintf(stderr, "%s", __FUNCTION__);fprintf(stderr, ": %s\n", msg) +#define MSG1(type, msg, a) fprintf(stderr, type ":");fprintf(stderr, "%s", __FUNCTION__);fprintf(stderr, ": " msg "\n", a) +#define MSG2(type, msg, a, b) fprintf(stderr, type ":");fprintf(stderr, "%s", __FUNCTION__);fprintf(stderr, ": " msg "\n", a, b) +#define MSG3(type, msg, a, b, c) fprintf(stderr, type ":");fprintf(stderr, "%s", __FUNCTION__);fprintf(stderr, ": " msg "\n", a, b, c) + +#define INFO0(msg) MSG0("info", msg) +#define INFO1(msg, a) MSG1("info", msg, a) +#define INFO2(msg, a, b) MSG2("info", msg, a, b) +#define INFO3(msg, a, b, c) MSG3("info", msg, a, b, c) + +#define ERROR0(msg) MSG0("error", msg) +#define ERROR1(msg, a) MSG1("error", msg, a) +#define ERROR2(msg, a, b) MSG2("error", msg, a, b) +#define ERROR3(msg, a, b, c) MSG3("error", msg, a, b, c) + static constexpr int FMPG_OUTPUT_BITS = 32; static constexpr int FMPG_OUTPUT_BYTES = 4; static constexpr AVSampleFormat FMPG_OUTPUT_FMT = AV_SAMPLE_FMT_S32; @@ -150,8 +165,11 @@ static const char *string_c_str(const std::string &s) } static std::string get_metadata_string(const AVFormatContext *ctx, - const char *key) + const char *key, bool &has_metadata) { + if (ctx->metadata == nullptr) { has_metadata = false; return ""; } + + has_metadata = true; const AVDictionaryEntry *entry = av_dict_get(ctx->metadata, key, nullptr, @@ -160,8 +178,11 @@ static std::string get_metadata_string(const AVFormatContext *ctx, : std::string(); } -static int get_metadata_int(const AVFormatContext *ctx, const char *key) +static int get_metadata_int(const AVFormatContext *ctx, const char *key, bool &has_metadata) { + if (ctx->metadata == nullptr) { has_metadata = false; return -1; } + has_metadata = true; + const AVDictionaryEntry *entry = av_dict_get(ctx->metadata, key, nullptr, @@ -239,15 +260,17 @@ static void fill_file_metadata(fmpg_instance *self) { AVFormatContext *ctx = self->format_ctx; + bool has_metadata; + self->file_info.clear(); - self->file_info.title = get_metadata_string(ctx, "title"); - self->file_info.author = get_metadata_string(ctx, "artist"); - self->file_info.album = get_metadata_string(ctx, "album"); - self->file_info.genre = get_metadata_string(ctx, "genre"); - self->file_info.comment = get_metadata_string(ctx, "comment"); - self->file_info.copyright = get_metadata_string(ctx, "copyright"); - self->file_info.year = get_metadata_int(ctx, "year"); - self->file_info.track = get_metadata_int(ctx, "track"); + self->file_info.title = get_metadata_string(ctx, "title", has_metadata); + self->file_info.author = get_metadata_string(ctx, "artist", has_metadata); + self->file_info.album = get_metadata_string(ctx, "album", has_metadata); + self->file_info.genre = get_metadata_string(ctx, "genre", has_metadata); + self->file_info.comment = get_metadata_string(ctx, "comment", has_metadata); + self->file_info.copyright = get_metadata_string(ctx, "copyright", has_metadata); + self->file_info.year = get_metadata_int(ctx, "year", has_metadata); + self->file_info.track = get_metadata_int(ctx, "track", has_metadata); self->file_info.bitrate = ctx->bit_rate > 0 ? static_cast(ctx->bit_rate) : -1; @@ -360,8 +383,44 @@ static bool init_decoder(fmpg_instance *self) return init_codec_context(self) && init_resampler(self); } +int fmpg_compatible_ffmpeg() +{ + int compiled_avformat_major = LIBAVFORMAT_VERSION_MAJOR; + int compiled_avcodec_major = LIBAVCODEC_VERSION_MAJOR; + int compiled_swresample_major = LIBSWRESAMPLE_VERSION_MAJOR; + int compiled_avutil_major = LIBAVUTIL_VERSION_MAJOR; + + int current_avformat_major = AV_VERSION_MAJOR(avformat_version()); + int current_avcodec_major = AV_VERSION_MAJOR(avcodec_version()); + int current_swresample_major = AV_VERSION_MAJOR(swresample_version()); + int current_avutil_major = AV_VERSION_MAJOR(avutil_version()); + + auto comp = [](const char *lib, int cv, int rv) { + if (cv != rv) { + ERROR3("FFMPEG %s Major versions not equal. Compile time: %d, runtime: %d", lib, cv, rv); + } + }; + + comp("AVFormat", compiled_avformat_major, current_avformat_major); + comp("AVCodec", compiled_avcodec_major, current_avcodec_major); + comp("SWResample", compiled_swresample_major, current_swresample_major); + comp("AVUtil", compiled_avutil_major, current_avutil_major); + + int compatible = (compiled_avformat_major == current_avformat_major) && + (compiled_avcodec_major == current_avcodec_major) && + (compiled_swresample_major == current_swresample_major) && + (compiled_avutil_major == current_avutil_major); + + return compatible; +} + fmpg_instance *fmpg_init(void) { + if (!fmpg_compatible_ffmpeg()) { + ERROR0("Compiled major ffmpeg version ≃ runtime major version, not compatible."); + return nullptr; + } + try { return new fmpg_instance(); } catch (...) { @@ -380,14 +439,21 @@ int fmpg_open_file(fmpg_instance *instance, const char *filename) return 0; } - if (avformat_open_input(&instance->format_ctx, - filename, - nullptr, - nullptr) < 0) { + if (instance->format_ctx != nullptr) { + return 0; + } + + int r = avformat_open_input(&instance->format_ctx, + filename, + nullptr, + nullptr); + if (r < 0) { fmpg_close(instance); return 0; } + fprintf(stderr, "metadata: %p", instance->format_ctx->metadata); + if (avformat_find_stream_info(instance->format_ctx, nullptr) < 0) { fmpg_close(instance); return 0; @@ -923,3 +989,35 @@ double fmpg_timecode(fmpg_instance *instance) { return instance ? instance->decoder.timecode : 0.0; } + +const char *fmpg_ffmpeg_version() +{ + static char *version = nullptr; + + if (version == nullptr) { + version = static_cast(malloc(1024)); + } + sprintf(version, "avformat: %u.%u.%u (%d), avcodec: %u.%u.%u (%d), swresample: %u.%u.%u (%d), avutil: %u.%u.%u (%d)", + LIBAVFORMAT_VERSION_MAJOR, LIBAVFORMAT_VERSION_MINOR, LIBAVFORMAT_VERSION_MICRO, LIBAVFORMAT_VERSION_INT, + LIBAVCODEC_VERSION_MAJOR, LIBAVCODEC_VERSION_MINOR, LIBAVCODEC_VERSION_MICRO, LIBAVCODEC_VERSION_INT, + LIBSWRESAMPLE_VERSION_MAJOR, LIBSWRESAMPLE_VERSION_MINOR, LIBSWRESAMPLE_VERSION_MICRO, LIBSWRESAMPLE_VERSION_INT, + LIBAVUTIL_VERSION_MAJOR, LIBAVUTIL_VERSION_MINOR, LIBAVUTIL_VERSION_MICRO, LIBAVUTIL_VERSION_INT + ); + return version; +} + +const char *fmpg_int_version2string(int ver) +{ + static char *version = nullptr; + + if (version == nullptr) { + version = static_cast(malloc(1024)); + } + + int major = AV_VERSION_MAJOR(ver); + int minor = AV_VERSION_MINOR(ver); + int micro = AV_VERSION_MICRO(ver); + sprintf(version, "%u.%u.%u", major, minor, micro); + + return version; +} diff --git a/ffmpeg-audio/ffmpeg_audio.h b/ffmpeg-audio/ffmpeg_audio.h index cdfdcb2..7dbd4aa 100644 --- a/ffmpeg-audio/ffmpeg_audio.h +++ b/ffmpeg-audio/ffmpeg_audio.h @@ -150,6 +150,10 @@ FFMPEG_EXTERN int64_t fmpg_sample_position(fmpg_instance *instance); /* Approximate start time of the current decoded block in seconds. */ FFMPEG_EXTERN double fmpg_timecode(fmpg_instance *instance); +FFMPEG_EXTERN const char *fmpg_ffmpeg_version(); +FFMPEG_EXTERN const char *fmpg_int_version2string(int ver); +FFMPEG_EXTERN int fmpg_compatible_ffmpeg(); + #ifdef __cplusplus } #endif diff --git a/lib/linux-x86_64.zip b/lib/linux-x86_64.zip index e5f0c5a224e1a6f9a9ef40a4a087072f3ee5ae2e..db63c6db0f7077c882d4c4d63905315afb171538 100644 GIT binary patch delta 29378 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 Ml9QR?|MB^M0DxLYH~;_u delta 7164 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