Add compat support for FFmpeg < 5.1
The new chlayout API has been introduced in FFmpeg 5.1. Use the old channel_layout API on older versions. PR #3757 <https://github.com/Genymobile/scrcpy/pull/3757>
This commit is contained in:
parent
fbe0f951e1
commit
d66b0b3dcc
4 changed files with 34 additions and 3 deletions
|
@ -286,11 +286,19 @@ static bool
|
||||||
sc_audio_player_frame_sink_open(struct sc_frame_sink *sink,
|
sc_audio_player_frame_sink_open(struct sc_frame_sink *sink,
|
||||||
const AVCodecContext *ctx) {
|
const AVCodecContext *ctx) {
|
||||||
struct sc_audio_player *ap = DOWNCAST(sink);
|
struct sc_audio_player *ap = DOWNCAST(sink);
|
||||||
|
#ifdef SCRCPY_LAVU_HAS_CHLAYOUT
|
||||||
|
assert(ctx->ch_layout.nb_channels > 0);
|
||||||
|
unsigned nb_channels = ctx->ch_layout.nb_channels;
|
||||||
|
#else
|
||||||
|
int tmp = av_get_channel_layout_nb_channels(ctx->channel_layout);
|
||||||
|
assert(tmp > 0);
|
||||||
|
unsigned nb_channels = tmp;
|
||||||
|
#endif
|
||||||
|
|
||||||
SDL_AudioSpec desired = {
|
SDL_AudioSpec desired = {
|
||||||
.freq = ctx->sample_rate,
|
.freq = ctx->sample_rate,
|
||||||
.format = SC_SDL_SAMPLE_FMT,
|
.format = SC_SDL_SAMPLE_FMT,
|
||||||
.channels = ctx->ch_layout.nb_channels,
|
.channels = nb_channels,
|
||||||
.samples = SC_AUDIO_OUTPUT_BUFFER_SAMPLES,
|
.samples = SC_AUDIO_OUTPUT_BUFFER_SAMPLES,
|
||||||
.callback = sc_audio_player_sdl_callback,
|
.callback = sc_audio_player_sdl_callback,
|
||||||
.userdata = ap,
|
.userdata = ap,
|
||||||
|
@ -311,13 +319,19 @@ sc_audio_player_frame_sink_open(struct sc_frame_sink *sink,
|
||||||
ap->swr_ctx = swr_ctx;
|
ap->swr_ctx = swr_ctx;
|
||||||
|
|
||||||
assert(ctx->sample_rate > 0);
|
assert(ctx->sample_rate > 0);
|
||||||
assert(ctx->ch_layout.nb_channels > 0);
|
|
||||||
assert(!av_sample_fmt_is_planar(SC_AV_SAMPLE_FMT));
|
assert(!av_sample_fmt_is_planar(SC_AV_SAMPLE_FMT));
|
||||||
int out_bytes_per_sample = av_get_bytes_per_sample(SC_AV_SAMPLE_FMT);
|
int out_bytes_per_sample = av_get_bytes_per_sample(SC_AV_SAMPLE_FMT);
|
||||||
assert(out_bytes_per_sample > 0);
|
assert(out_bytes_per_sample > 0);
|
||||||
|
|
||||||
|
#ifdef SCRCPY_LAVU_HAS_CHLAYOUT
|
||||||
av_opt_set_chlayout(swr_ctx, "in_chlayout", &ctx->ch_layout, 0);
|
av_opt_set_chlayout(swr_ctx, "in_chlayout", &ctx->ch_layout, 0);
|
||||||
av_opt_set_chlayout(swr_ctx, "out_chlayout", &ctx->ch_layout, 0);
|
av_opt_set_chlayout(swr_ctx, "out_chlayout", &ctx->ch_layout, 0);
|
||||||
|
#else
|
||||||
|
av_opt_set_channel_layout(swr_ctx, "in_channel_layout",
|
||||||
|
ctx->channel_layout, 0);
|
||||||
|
av_opt_set_channel_layout(swr_ctx, "out_channel_layout",
|
||||||
|
ctx->channel_layout, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
av_opt_set_int(swr_ctx, "in_sample_rate", ctx->sample_rate, 0);
|
av_opt_set_int(swr_ctx, "in_sample_rate", ctx->sample_rate, 0);
|
||||||
av_opt_set_int(swr_ctx, "out_sample_rate", ctx->sample_rate, 0);
|
av_opt_set_int(swr_ctx, "out_sample_rate", ctx->sample_rate, 0);
|
||||||
|
@ -332,7 +346,7 @@ sc_audio_player_frame_sink_open(struct sc_frame_sink *sink,
|
||||||
}
|
}
|
||||||
|
|
||||||
ap->sample_rate = ctx->sample_rate;
|
ap->sample_rate = ctx->sample_rate;
|
||||||
ap->nb_channels = ctx->ch_layout.nb_channels;
|
ap->nb_channels = nb_channels;
|
||||||
ap->out_bytes_per_sample = out_bytes_per_sample;
|
ap->out_bytes_per_sample = out_bytes_per_sample;
|
||||||
|
|
||||||
ap->target_buffering = ap->target_buffering_delay * ap->sample_rate
|
ap->target_buffering = ap->target_buffering_delay * ap->sample_rate
|
||||||
|
|
|
@ -37,6 +37,13 @@
|
||||||
# define SCRCPY_LAVF_HAS_AVFORMATCONTEXT_URL
|
# define SCRCPY_LAVF_HAS_AVFORMATCONTEXT_URL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Not documented in ffmpeg/doc/APIchanges, but the channel_layout API
|
||||||
|
// has been replaced by chlayout in FFmpeg commit
|
||||||
|
// f423497b455da06c1337846902c770028760e094.
|
||||||
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 23, 100)
|
||||||
|
# define SCRCPY_LAVU_HAS_CHLAYOUT
|
||||||
|
#endif
|
||||||
|
|
||||||
#if SDL_VERSION_ATLEAST(2, 0, 6)
|
#if SDL_VERSION_ATLEAST(2, 0, 6)
|
||||||
// <https://github.com/libsdl-org/SDL/commit/d7a318de563125e5bb465b1000d6bc9576fbc6fc>
|
// <https://github.com/libsdl-org/SDL/commit/d7a318de563125e5bb465b1000d6bc9576fbc6fc>
|
||||||
# define SCRCPY_SDL_HAS_HINT_TOUCH_MOUSE_EVENTS
|
# define SCRCPY_SDL_HAS_HINT_TOUCH_MOUSE_EVENTS
|
||||||
|
|
|
@ -26,8 +26,13 @@ sc_decoder_open(struct sc_decoder *decoder, const AVCodec *codec) {
|
||||||
decoder->codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
decoder->codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
||||||
} else {
|
} else {
|
||||||
// Hardcoded audio properties
|
// Hardcoded audio properties
|
||||||
|
#ifdef SCRCPY_LAVU_HAS_CHLAYOUT
|
||||||
decoder->codec_ctx->ch_layout =
|
decoder->codec_ctx->ch_layout =
|
||||||
(AVChannelLayout) AV_CHANNEL_LAYOUT_STEREO;
|
(AVChannelLayout) AV_CHANNEL_LAYOUT_STEREO;
|
||||||
|
#else
|
||||||
|
decoder->codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO;
|
||||||
|
decoder->codec_ctx->channels = 2;
|
||||||
|
#endif
|
||||||
decoder->codec_ctx->sample_rate = 48000;
|
decoder->codec_ctx->sample_rate = 48000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -202,7 +202,12 @@ sc_recorder_wait_audio_stream(struct sc_recorder *recorder) {
|
||||||
|
|
||||||
stream->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
|
stream->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
|
||||||
stream->codecpar->codec_id = codec->id;
|
stream->codecpar->codec_id = codec->id;
|
||||||
|
#ifdef SCRCPY_LAVU_HAS_CHLAYOUT
|
||||||
stream->codecpar->ch_layout.nb_channels = 2;
|
stream->codecpar->ch_layout.nb_channels = 2;
|
||||||
|
#else
|
||||||
|
stream->codecpar->channel_layout = AV_CH_LAYOUT_STEREO;
|
||||||
|
stream->codecpar->channels = 2;
|
||||||
|
#endif
|
||||||
stream->codecpar->sample_rate = 48000;
|
stream->codecpar->sample_rate = 48000;
|
||||||
|
|
||||||
recorder->audio_stream_index = stream->index;
|
recorder->audio_stream_index = stream->index;
|
||||||
|
|
Loading…
Reference in a new issue