Compare commits

..

2 Commits

3 changed files with 211 additions and 123 deletions
+207 -121
View File
@@ -48,6 +48,89 @@
(define (AVERROR e) (* -1 e)) (define (AVERROR e) (* -1 e))
;;;; Load libraries and get major library versions.
(define libavutil (get-lib (case (system-type 'os)
[(windows) '("avutil-60")]
[else '("avutil" "libavutil")]) '(#f)))
(define libswresample (get-lib (case (system-type 'os)
[(windows) '("swresample-6")]
[else '("swresample" "libswresample")]) '(#f)))
(define libavcodec (get-lib (case (system-type 'os)
[(windows) '("avcodec-62")]
[else '("avcodec" "libavcodec")]) '(#f)))
(define libavformat (get-lib (case (system-type 'os)
[(windows) '("avformat-62")]
[else '("avformat" "libavformat")]) '(#f)))
(define-ffi-definer def-avutil libavutil #:default-make-fail make-not-available)
(define-ffi-definer def-swresample libswresample #:default-make-fail make-not-available)
(define-ffi-definer def-avcodec libavcodec #:default-make-fail make-not-available)
(define-ffi-definer def-avformat libavformat #:default-make-fail make-not-available)
(def-avutil avutil_version (_fun -> _uint))
(def-avcodec avcodec_version (_fun -> _uint))
(def-avformat avformat_version (_fun -> _uint))
(def-swresample swresample_version (_fun -> _uint))
(define avutil-version-major (quotient (avutil_version) 65536))
(define avcodec-version-major (quotient (avcodec_version) 65536))
(define avformat-version-major (quotient (avformat_version) 65536))
(define swresample-version-major (quotient (swresample_version) 65536))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Version check
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (ffmpeg-version lib)
(let ((v (λ (v) (list (quotient v 65536) (remainder (quotient v 256) 256) (remainder v 256)))))
(cond ((eq? lib 'avutil) (v (avutil_version)))
((eq? lib 'avcodec) (v (avcodec_version)))
((eq? lib 'avformat) (v (avformat_version)))
((or (eq? lib 'swr)
(eq? lib 'swresample)) (v (swresample_version)))
(else (error (format "Unknown library '~a" lib)))
)
)
)
(define (ffmpeg-version-string lib)
(apply format (cons "~a.~a.~a" (ffmpeg-version lib))))
;; Support ffmpeg 6, 7 and 8
(define-syntax check-support
(syntax-rules ()
((_ lib version-hash)
(let ((from (car (hash-ref version-hash lib)))
(until (cadr (hash-ref version-hash lib))))
(let ((major-version (car (ffmpeg-version lib))))
(cond
((or (< major-version from) (> major-version until))
(error
(format "Unsupported major version of ffmpeg library ~a: ~a (~a).\nSupported range: ~a - ~a"
'lib major-version (ffmpeg-version-string lib) from until)))
(else
(info-sound "Supported ffmpeg library ~a - version ~a between ~a and ~a"
lib (ffmpeg-version-string lib) from until)
)
)
)
)
)
)
)
(check-support 'avutil valid-ffmpeg-versions)
(check-support 'avcodec valid-ffmpeg-versions)
(check-support 'avformat valid-ffmpeg-versions)
(check-support 'swresample valid-ffmpeg-versions)
;;;; Constants ;;;; Constants
(define-cstruct _AVRational (define-cstruct _AVRational
@@ -103,29 +186,83 @@
; codec_id : int / AVCodecID ; codec_id : int / AVCodecID
; ch_layout : AVChannelLayout ; ch_layout : AVChannelLayout
; sample_rate : int ; sample_rate : int
; libavcodec stuff.
(def-cstruct (def-cstruct
_AVCodecParameters _AVCodecParameters
(codec_type codec_id format ch_layout sample_rate) (codec_type codec_id format ch_layout sample_rate)
(make-offsets (codec_type _AVMediaType) (if (= avcodec-version-major 60)
(codec_id _AVCodecID) ;; ffmpeg 6 definition is different and probably backward compatible with ffmpeg 5
;; This is with old channel layout in compiled, which is the case on linux.
;; Probably always, because of back compatibility with ffmpeg 5.0 probably.
(make-offsets
(codec_type _AVMediaType)
(codec_id _AVCodecID)
;; codec_tag, extradata, extradata_size, _uint32 ;; codec_tag
;; coded_side_data, nb_coded_side_data _pointer ;; extradata
_int32 _pointer _int _pointer _int _int ;; extradata_size
;; AVCodecParameters.format (format _AVSampleFormat)
;; audio: enum AVSampleFormat
(format _AVSampleFormat)
_int64 ; bit_rate _int64 ;; bit_rate
(6 _int)
(2 _AVRational)
(7 _int)
(ch_layout _AVChannelLayout) (6 _int) ;; bits_per_coded_sample, bits_per_raw_sample,
(sample_rate _int)) ;; profile, level, width, height
_AVRational ;; sample_aspect_ratio
(6 _int) ;; field_order, color_range, color_primaries,
;; color_trc, color_space, chroma_location
_int ;; video_delay
;; Alleen als FF_API_OLD_CHANNEL_LAYOUT actief is.
_uint64 ;; channel_layout
_int ;; channels
(sample_rate _int)
(5 _int) ;; block_align, frame_size,
;; initial_padding, trailing_padding, seek_preroll
(ch_layout _AVChannelLayout)
;; framerate, coded_side_data, nb_coded_side_data komen hierna,
;; maar die heb je niet nodig.
)
;;;;;;; ffmpeg 7 and 8. (major versions 61 and 62).
(make-offsets (codec_type _AVMediaType)
(codec_id _AVCodecID)
_int32 ;; codec_tag
_pointer ;; extradata
_int ;; extradata_size
_pointer ;; coded_side_data
_int ;; nb_coded_side_data
;; AVCodecParameters.format
;; audio: enum AVSampleFormat
(format _AVSampleFormat)
_int64 ;; bit_rate
(6 _int) ;; bits_per_coded_sample, bits_per_raw_sample,
;; profile, level, width, height,
(2 _AVRational) ;; sample_aspect_ratio, ramerate
(7 _int) ;; field_order, color_range,
;; color_primaries, color_trc,
;; color_space, chroma_location,
;; video_delay
(ch_layout _AVChannelLayout) ;; ch_layout
(sample_rate _int)) ;; sample_rate
)
) )
(define (avcodec-pars-codec_id s) (define (avcodec-pars-codec_id s)
(AVCodecParameters-codec_id s)) (AVCodecParameters-codec_id s))
@@ -197,29 +334,61 @@
(def-cstruct (def-cstruct
_AVFrame _AVFrame
(data nb_samples sample_rate best_effort_timestamp) (data nb_samples sample_rate best_effort_timestamp)
(make-offsets (if (= avutil-version-major 58)
(data _pointer) ;;; avutil 58 (ffmpeg 6.x)
(7 _pointer) ; data (make-offsets
(8 _int) ; linesize (data _pointer)
_pointer ; extended-data (7 _pointer) ; data
(2 _int) ; width, height (8 _int) ; linesize
(nb_samples _int) ; nb_samples _pointer ; extended-data
(2 _int) ; format / enum Picturetype (2 _int) ; width, height
_AVRational ; sample_aspect_ratio; (nb_samples _int) ; nb_samples
(2 _int64) ; pts / pkt_dts (3 _int) ; format / key_frame / enum Picturetype ;;; deprecated FRAME_KEY
_AVRational ; time_base _AVRational ; sample_aspect_ratio;
_int ; quality (2 _int64) ; pts / pkt_dts
_pointer ; opaque _AVRational ; time_base
_int ; repeat_pict (2 _int) ; coded_picture_number / display_picture_number ;; PICTURE_NUMBER
(sample_rate _int); sample_rate _int ; quality
(8 _pointer) ; AVBufferRef *buf[AV_NUM_DATA_POINTERS]; _pointer ; opaque
_pointer ; AVBufferRef **extended_buf; _int ; repeat_pict
_int ; int nb_extended_buf; (2 _int) ; interlaced_frame / top_field_first ;; INTERLACED_FRAME
_pointer ; AVFrameSideData **side_data; _int64 ; reordered_opaque ;; REORDERED_OPAQUE
_int ; nb_side_data; (sample_rate _int); sample_rate
(6 _int) ; flags / color_range / color_primaries / color_trc / colorspace / chroma_location _int64 ; channel_layout ;; OLD_CHANNEL_LAYOUT
(best_effort_timestamp _int64) ; best_effort_timestamp (8 _pointer) ; AVBufferRef *buf[AV_NUM_DATA_POINTERS];
)) _pointer ; AVBufferRef **extended_buf;
_int ; int nb_extended_buf;
_pointer ; AVFrameSideData **side_data;
_int ; nb_side_data;
(6 _int) ; flags / color_range / color_primaries / color_trc / colorspace / chroma_location
(best_effort_timestamp _int64) ; best_effort_timestamp
)
;;; ffmpeg 7, 8 - avutil 59 and 60.
(make-offsets
(data _pointer)
(7 _pointer) ; data
(8 _int) ; linesize
_pointer ; extended-data
(2 _int) ; width, height
(nb_samples _int) ; nb_samples
(2 _int) ; format / enum Picturetype
_AVRational ; sample_aspect_ratio;
(2 _int64) ; pts / pkt_dts
_AVRational ; time_base
_int ; quality
_pointer ; opaque
_int ; repeat_pict
(sample_rate _int); sample_rate
(8 _pointer) ; AVBufferRef *buf[AV_NUM_DATA_POINTERS];
_pointer ; AVBufferRef **extended_buf;
_int ; int nb_extended_buf;
_pointer ; AVFrameSideData **side_data;
_int ; nb_side_data;
(6 _int) ; flags / color_range / color_primaries / color_trc / colorspace / chroma_location
(best_effort_timestamp _int64) ; best_effort_timestamp
)
)
)
(define (avframe-data frame) (define (avframe-data frame)
;; swr_convert wil const uint8_t **. ;; swr_convert wil const uint8_t **.
@@ -254,36 +423,7 @@
(define (avpacket-stream-index pkt) (define (avpacket-stream-index pkt)
(AVPacket-stream_index pkt)) (AVPacket-stream_index pkt))
;;;; Needed functions for audio decoder ;;;;; Now import the needed functions
(define libavutil (get-lib (list (case (system-type 'os)
[(windows) "avutil-60"]
[else "avutil"])) '(#f)))
(define libswresample (get-lib (list (case (system-type 'os)
[(windows) "swresample-6"]
[else "swresample"])) '(#f)))
(define libavcodec (get-lib (list (case (system-type 'os)
[(windows) "avcodec-62"]
[else "avcodec"])) '(#f)))
(define libavformat (get-lib (list (case (system-type 'os)
[(windows) "avformat-62"]
[else "avformat"])) '(#f)))
(define-ffi-definer def-avutil libavutil #:default-make-fail make-not-available)
(define-ffi-definer def-swresample libswresample #:default-make-fail make-not-available)
(define-ffi-definer def-avcodec libavcodec #:default-make-fail make-not-available)
(define-ffi-definer def-avformat libavformat #:default-make-fail make-not-available)
(def-avutil avutil_version (_fun -> _uint))
(def-avcodec avcodec_version (_fun -> _uint))
(def-avformat avformat_version (_fun -> _uint))
(def-swresample swresample_version (_fun -> _uint))
(def-avcodec avcodec_free_context/raw (_fun (_ptr io _AVCodecContext) (def-avcodec avcodec_free_context/raw (_fun (_ptr io _AVCodecContext)
-> (p : _AVCodecContext) -> (p : _AVCodecContext)
@@ -458,60 +598,6 @@
(def-swresample swr_close (def-swresample swr_close
(_fun _SwrContext -> _void)) (_fun _SwrContext -> _void))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Version check
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define avutil-version-major (quotient (avutil_version) 65536))
(define avcodec-version-major (quotient (avcodec_version) 65536))
(define avformat-version-major (quotient (avformat_version) 65536))
(define swresample-version-major (quotient (swresample_version) 65536))
(define (ffmpeg-version lib)
(let ((v (λ (v) (list (quotient v 65536) (remainder (quotient v 256) 256) (remainder v 256)))))
(cond ((eq? lib 'avutil) (v (avutil_version)))
((eq? lib 'avcodec) (v (avcodec_version)))
((eq? lib 'avformat) (v (avformat_version)))
((or (eq? lib 'swr)
(eq? lib 'swresample)) (v (swresample_version)))
(else (error (format "Unknown library '~a" lib)))
)
)
)
(define (ffmpeg-version-string lib)
(apply format (cons "~a.~a.~a" (ffmpeg-version lib))))
;; Support ffmpeg 6, 7 and 8
(define-syntax check-support
(syntax-rules ()
((_ lib version-hash)
(let ((from (car (hash-ref version-hash lib)))
(until (cadr (hash-ref version-hash lib))))
(let ((major-version (car (ffmpeg-version lib))))
(cond
((or (< major-version from) (> major-version until))
(error
(format "Unsupported major version of ffmpeg library ~a: ~a (~a).\nSupported range: ~a - ~a"
'lib major-version (ffmpeg-version-string lib) from until)))
(else
(info-sound "Supported ffmpeg library ~a - version ~a between ~a and ~a"
lib (ffmpeg-version-string lib) from until)
)
)
)
)
)
)
)
(check-support 'avutil valid-ffmpeg-versions)
(check-support 'avcodec valid-ffmpeg-versions)
(check-support 'avformat valid-ffmpeg-versions)
(check-support 'swresample valid-ffmpeg-versions)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Constants ;; Constants
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+2 -2
View File
@@ -756,9 +756,9 @@
(let ((ao-size buf-size) (let ((ao-size buf-size)
(ao-mem au-buf)) (ao-mem au-buf))
(let ((m (convert-req-bits-to-dev-bits h mem info))) (let ((m (convert-req-bits-to-dev-bits h au-buf info)))
(when (eq? (cadr m) #t) (when (eq? (cadr m) #t)
(reuse-buf h mem) (reuse-buf h au-buf)
(set! ao-mem (car m)) (set! ao-mem (car m))
(set! ao-size (mem-size ao-mem)))) (set! ao-size (mem-size ao-mem))))
+2
View File
@@ -157,8 +157,10 @@
(cons (soundlibs-directory) p))) (cons (soundlibs-directory) p)))
(define (get-lib* libs-to-try orig-libs versions) (define (get-lib* libs-to-try orig-libs versions)
(unless (soundlibs-available?) (unless (soundlibs-available?)
(download-soundlibs)) (download-soundlibs))
(let ((libs-path (build-lib-path (get-lib-search-dirs)))) (let ((libs-path (build-lib-path (get-lib-search-dirs))))
(if (null? libs-to-try) (if (null? libs-to-try)
(begin (begin