diff options
author | wm4 <wm4@nowhere> | 2015-06-12 17:44:40 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-06-12 17:44:40 +0200 |
commit | 627b87b0d8b165e76c5715cdda1cee578ec3a6fa (patch) | |
tree | 89bfad2bca8a54d3974fb57df6e2cd1645a58b67 /audio | |
parent | 0d2456ae5f0440bbea357d7463618fa8bd41ca88 (diff) |
audio: deal with AVFrame-style buffer assignments
In the AVFrame-style system (which we inreasingly map our internal data
stuctures on), buffers and plane pointers don't necessarily have a 1:1
correspondence. For example, a single buffer could cover 2 or more
planes, all while other planes are covered by a second buffer, and so
on. They don't need to be ordered in the same way.
Change mp_audio_get_allocated_size() to retrieve the maximum size all
planes provide. This also considers the case of planes not pointing to
buffer start.
Change mp_audio_realloc() to reset all planes, even if corresponding
buffers are not reallocated. (The caller has to be careful anyway if it
wants to be sure the contents are preserved on realloc calls.)
Diffstat (limited to 'audio')
-rw-r--r-- | audio/audio.c | 16 | ||||
-rw-r--r-- | audio/audio.h | 5 |
2 files changed, 17 insertions, 4 deletions
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]; }; |