diff options
author | Alex Converse <alex.converse@gmail.com> | 2009-05-13 22:57:30 +0000 |
---|---|---|
committer | Alex Converse <alex.converse@gmail.com> | 2009-05-13 22:57:30 +0000 |
commit | 107815de42dc088de6087f3f86f71c52974fe43e (patch) | |
tree | c3cf336453e504cb9ee6375a7c5c80aa6328d139 /libavcodec | |
parent | f2e5c8b96a4289ca3bf3b76f916d8f791bcb964e (diff) | |
download | ffmpeg-107815de42dc088de6087f3f86f71c52974fe43e.tar.gz |
Subroutine to copy an AAC Program Config Element (PCE)
Originally committed as revision 18817 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/mpeg4audio.c | 42 | ||||
-rw-r--r-- | libavcodec/mpeg4audio.h | 7 |
2 files changed, 49 insertions, 0 deletions
diff --git a/libavcodec/mpeg4audio.c b/libavcodec/mpeg4audio.c index 91ea2b7c9b..e9b60b7ee0 100644 --- a/libavcodec/mpeg4audio.c +++ b/libavcodec/mpeg4audio.c @@ -1,6 +1,7 @@ /* * MPEG-4 Audio common code * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr> + * Copyright (c) 2009 Alex Converse <alex.converse@gmail.com> * * This file is part of FFmpeg. * @@ -20,6 +21,7 @@ */ #include "get_bits.h" +#include "put_bits.h" #include "mpeg4audio.h" const int ff_mpeg4audio_sample_rates[16] = { @@ -84,3 +86,43 @@ int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_si } return specific_config_bitindex; } + +static av_always_inline unsigned int copy_bits(PutBitContext *pb, + GetBitContext *gb, + int bits) +{ + unsigned int el = get_bits(gb, bits); + put_bits(pb, bits, el); + return el; +} + +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); + + copy_bits(pb, gb, 10); //Tag, Object Type, Frequency + five_bit_ch = copy_bits(pb, gb, 4); //Front + five_bit_ch += copy_bits(pb, gb, 4); //Side + five_bit_ch += copy_bits(pb, gb, 4); //Back + four_bit_ch = copy_bits(pb, gb, 2); //LFE + four_bit_ch += copy_bits(pb, gb, 3); //Data + five_bit_ch += copy_bits(pb, gb, 4); //Coupling + if (copy_bits(pb, gb, 1)) //Mono Mixdown + copy_bits(pb, gb, 4); + if (copy_bits(pb, gb, 1)) //Stereo Mixdown + copy_bits(pb, gb, 4); + if (copy_bits(pb, gb, 1)) //Matrix Mixdown + copy_bits(pb, gb, 3); + for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16) + copy_bits(pb, gb, 16); + if (bits) + copy_bits(pb, gb, bits); + align_put_bits(pb); + align_get_bits(gb); + comment_size = copy_bits(pb, gb, 8); + for (; comment_size > 0; comment_size--) + copy_bits(pb, gb, 8); + + return put_bits_count(pb) - offset; +} diff --git a/libavcodec/mpeg4audio.h b/libavcodec/mpeg4audio.h index b149362f0e..fd78bdbee9 100644 --- a/libavcodec/mpeg4audio.h +++ b/libavcodec/mpeg4audio.h @@ -23,6 +23,8 @@ #define AVCODEC_MPEG4AUDIO_H #include <stdint.h> +#include "get_bits.h" +#include "put_bits.h" typedef struct { int object_type; @@ -90,4 +92,9 @@ enum AudioObjectType { AOT_SMR_MAIN, ///< N Symbolic Music Representation Main }; +#define MAX_PCE_SIZE 304 ///<Maximum size of a PCE including the 3-bit ID_PCE + ///<marker and the comment + +int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb); + #endif /* AVCODEC_MPEG4AUDIO_H */ |