diff options
author | Anton Khirnov <anton@khirnov.net> | 2017-03-16 17:34:12 +0100 |
---|---|---|
committer | Diego Biurrun <diego@biurrun.de> | 2017-04-28 13:47:20 +0200 |
commit | 831018b0bbe26a603802a9022472f714a59293be (patch) | |
tree | beddfc357bcd8d1c8236ec60a993a6a5f2931c80 /libavcodec/mpeg4audio.h | |
parent | e1c2453a4fac1f7116244d0d05310935c20887e6 (diff) |
mpeg4audio: Make avpriv_copy_pce_data() inline
The function currently accepts a PutBitContext and a GetBitContext,
which hardcodes their sizes into the lavc ABI. Since the function is
quite small and only called in a few places, the simplest solution is
making it inline, thus avoiding a runtime dependency completely.
Signed-off-by: Diego Biurrun <diego@biurrun.de>
Diffstat (limited to 'libavcodec/mpeg4audio.h')
-rw-r--r-- | libavcodec/mpeg4audio.h | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/libavcodec/mpeg4audio.h b/libavcodec/mpeg4audio.h index 2eef2205bd..01f30c6ca7 100644 --- a/libavcodec/mpeg4audio.h +++ b/libavcodec/mpeg4audio.h @@ -23,6 +23,9 @@ #define AVCODEC_MPEG4AUDIO_H #include <stdint.h> + +#include "libavutil/attributes.h" + #include "get_bits.h" #include "put_bits.h" @@ -105,6 +108,44 @@ enum AudioObjectType { #define MAX_PCE_SIZE 304 ///<Maximum size of a PCE including the 3-bit ID_PCE ///<marker and the comment -int avpriv_copy_pce_data(PutBitContext *pb, GetBitContext *gb); +static av_always_inline unsigned int ff_pce_copy_bits(PutBitContext *pb, + GetBitContext *gb, + int bits) +{ + unsigned int el = get_bits(gb, bits); + put_bits(pb, bits, el); + return el; +} + +static inline int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb) +{ + int five_bit_ch, four_bit_ch, comment_size, bits; + int offset = put_bits_count(pb); + + ff_pce_copy_bits(pb, gb, 10); // Tag, Object Type, Frequency + five_bit_ch = ff_pce_copy_bits(pb, gb, 4); // Front + five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Side + five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Back + four_bit_ch = ff_pce_copy_bits(pb, gb, 2); // LFE + four_bit_ch += ff_pce_copy_bits(pb, gb, 3); // Data + five_bit_ch += ff_pce_copy_bits(pb, gb, 4); // Coupling + if (ff_pce_copy_bits(pb, gb, 1)) // Mono Mixdown + ff_pce_copy_bits(pb, gb, 4); + if (ff_pce_copy_bits(pb, gb, 1)) // Stereo Mixdown + ff_pce_copy_bits(pb, gb, 4); + if (ff_pce_copy_bits(pb, gb, 1)) // Matrix Mixdown + ff_pce_copy_bits(pb, gb, 3); + for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16) + ff_pce_copy_bits(pb, gb, 16); + if (bits) + ff_pce_copy_bits(pb, gb, bits); + avpriv_align_put_bits(pb); + align_get_bits(gb); + comment_size = ff_pce_copy_bits(pb, gb, 8); + for (; comment_size > 0; comment_size--) + ff_pce_copy_bits(pb, gb, 8); + + return put_bits_count(pb) - offset; +} #endif /* AVCODEC_MPEG4AUDIO_H */ |