From 01c452cfba04a16872e918bd6781c2c8d00a3f18 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 8 May 2015 21:22:39 +0200 Subject: [PATCH] audio: simplify further Drop mp_chmap_diff() (which is unused too now), and implement mp_chmap_diffn() in a slightly simpler way. (Too bad there is no standard function for counting set bits.) (cherry picked from commit 00130651dac758f90bf98306a9d1e569ed4155ca) --- audio/chmap.c | 22 ++++++++-------------- audio/chmap.h | 2 -- test/chmap.c | 15 +++------------ 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/audio/chmap.c b/audio/chmap.c index 4f76eedd59..4fd43e3bc7 100644 --- a/audio/chmap.c +++ b/audio/chmap.c @@ -395,26 +395,20 @@ void mp_chmap_get_reorder(int src[MP_NUM_CHANNELS], const struct mp_chmap *from, assert(src[n] < 0 || (to->speaker[n] == from->speaker[src[n]])); } -// Return channels that are only in a. -// Performs the difference between a and b, and store it in diff. If b has -// channels that do not appear in a, those will not appear in the difference. -// To get to those the argument ordering in the function call has to be -// inverted. For the same reason, the diff with a superset will return no -// speakers. -void mp_chmap_diff(const struct mp_chmap *a, const struct mp_chmap *b, - struct mp_chmap *diff) +static int popcount64(uint64_t bits) { - uint64_t a_mask = mp_chmap_to_lavc_unchecked(a); - uint64_t b_mask = mp_chmap_to_lavc_unchecked(b); - mp_chmap_from_lavc(diff, (a_mask ^ b_mask) & a_mask); + int r = 0; + for (int n = 0; n < 64; n++) + r += !!(bits & (1ULL << n)); + return r; } // Return the number of channels only in a. int mp_chmap_diffn(const struct mp_chmap *a, const struct mp_chmap *b) { - struct mp_chmap diff; - mp_chmap_diff(a, b, &diff); - return diff.num; + uint64_t a_mask = mp_chmap_to_lavc_unchecked(a); + uint64_t b_mask = mp_chmap_to_lavc_unchecked(b); + return popcount64((a_mask ^ b_mask) & a_mask); } // Returns something like "fl-fr-fc". If there's a standard layout in lavc diff --git a/audio/chmap.h b/audio/chmap.h index c3826065ce..adb7481665 100644 --- a/audio/chmap.h +++ b/audio/chmap.h @@ -123,8 +123,6 @@ void mp_chmap_reorder_to_lavc(struct mp_chmap *map); void mp_chmap_get_reorder(int src[MP_NUM_CHANNELS], const struct mp_chmap *from, const struct mp_chmap *to); -void mp_chmap_diff(const struct mp_chmap *a, const struct mp_chmap *b, - struct mp_chmap *diff); int mp_chmap_diffn(const struct mp_chmap *a, const struct mp_chmap *b); char *mp_chmap_to_str_buf(char *buf, size_t buf_size, const struct mp_chmap *src); diff --git a/test/chmap.c b/test/chmap.c index 4bd4ba7b58..365c15be52 100644 --- a/test/chmap.c +++ b/test/chmap.c @@ -4,24 +4,15 @@ static void test_mp_chmap_diff(void **state) { struct mp_chmap a; struct mp_chmap b; - struct mp_chmap diff; mp_chmap_from_str(&a, bstr0("3.1")); mp_chmap_from_str(&b, bstr0("2.1")); - mp_chmap_diff(&a, &b, &diff); - assert_int_equal(diff.num, 1); - assert_int_equal(diff.speaker[0], MP_SPEAKER_ID_FC); + assert_int_equal(mp_chmap_diffn(&a, &b), 1); mp_chmap_from_str(&b, bstr0("6.1(back)")); - mp_chmap_diff(&a, &b, &diff); - assert_int_equal(diff.num, 0); - - mp_chmap_diff(&b, &a, &diff); - assert_int_equal(diff.num, 3); - assert_int_equal(diff.speaker[0], MP_SPEAKER_ID_BL); - assert_int_equal(diff.speaker[1], MP_SPEAKER_ID_BR); - assert_int_equal(diff.speaker[2], MP_SPEAKER_ID_BC); + assert_int_equal(mp_chmap_diffn(&a, &b), 0); + assert_int_equal(mp_chmap_diffn(&b, &a), 3); } int main(void) {