diff --git a/audio/audio.c b/audio/audio.c index 263470261e..baf00c08b2 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -160,8 +160,8 @@ void mp_audio_realloc(struct mp_audio *mpa, int samples) if (!mpa->allocated[n] || size != mpa->allocated[n]->size) { if (av_buffer_realloc(&mpa->allocated[n], size) < 0) abort(); // OOM - mpa->planes[n] = mpa->allocated[n]->data; } + mpa->planes[n] = mpa->allocated[n]->data; } for (int n = mpa->num_planes; n < MP_NUM_CHANNELS; n++) { av_buffer_unref(&mpa->allocated[n]); @@ -192,8 +192,18 @@ int mp_audio_get_allocated_size(struct mp_audio *mpa) { int size = 0; for (int n = 0; n < mpa->num_planes; n++) { - int s = mpa->allocated[n] ? mpa->allocated[n]->size / mpa->sstride : 0; - size = n == 0 ? s : MPMIN(size, s); + for (int i = 0; i < MP_NUM_CHANNELS && mpa->allocated[i]; i++) { + uint8_t *start = mpa->allocated[i]->data; + uint8_t *end = start + mpa->allocated[i]->size; + uint8_t *plane = mpa->planes[n]; + if (plane >= start && plane < end) { + int s = MPMIN((end - plane) / mpa->sstride, INT_MAX); + size = n == 0 ? s : MPMIN(size, s); + goto next; + } + } + return 0; // plane is not covered by any buffer + next: ; } return size; } diff --git a/audio/audio.h b/audio/audio.h index a633a15b4d..7bfffa7887 100644 --- a/audio/audio.h +++ b/audio/audio.h @@ -37,8 +37,11 @@ struct mp_audio { int num_planes; // number of planes int bps; // size of sub-samples (af_fmt2bps(format)) - // private + // --- private bool readonly; + // These do not necessarily map directly to planes[]. They can have + // different order or count. There shouldn't be more buffers than planes. + // If allocated[n] is NULL, allocated[n+1] must also be NULL. struct AVBufferRef *allocated[MP_NUM_CHANNELS]; };