[FFmpeg-soc] [soc]: r5570 - in amr: amrnbdata.h amrnbdec.c
Vitor Sessak
vitor1001 at gmail.com
Sat Jan 9 15:29:47 CET 2010
Michael Niedermayer wrote:
> On Fri, Jan 08, 2010 at 10:19:54PM -0500, Vitor Sessak wrote:
>> cmcq wrote:
>>> Author: cmcq
>>> Date: Fri Jan 8 18:16:25 2010
>>> New Revision: 5570
>>> Log:
>>> Save about 1KB of space using a field-to-bit lookup instead of
>>> bit-to-field.
>>> Modified:
>>> amr/amrnbdata.h
>>> amr/amrnbdec.c
>>> Modified: amr/amrnbdata.h
>>> ==============================================================================
>>> --- amr/amrnbdata.h Fri Jan 8 18:13:05 2010 (r5569)
>>> +++ amr/amrnbdata.h Fri Jan 8 18:16:25 2010 (r5570)
>>> @@ -68,15 +68,6 @@ enum Mode {
>>> #define LP_FILTER_ORDER 10 ///< linear predictive coding filter
>>> order
>> [...]
>>
>>> +// Each field in AMRNBFrame is stored as:
>>> +// one byte of 16 * index in AMRNBFrame relative to previous field
>>> +// + number of bits in the field
>>> +// then, one byte for each bit of the field (from most-significant to
>>> least)
>>> +// of the position of that bit in the AMR frame.
>>> +static const uint8_t order_MODE_4k75[] = {
>>> + 0x28, 7, 6, 5, 4, 3, 2, 1, 0,
>>> + 0x18, 15, 14, 13, 12, 11, 10, 9, 8,
>>> + 0x17, 51, 35, 34, 50, 33, 49, 32,
>>> + 0x38, 23, 22, 21, 20, 19, 18, 43, 42,
>> [...]
>>
>>> if (mode <= MODE_DTX) {
>>> uint16_t *data = (uint16_t *)&p->frame;
>>> - const AMROrder *order = amr_unpacking_bitmaps_per_mode[mode];
>>> - int i;
>>> + const uint8_t *order = amr_unpacking_bitmaps_per_mode[mode];
>>> + int field_header; // 16 * relative field index + number of field
>>> bits
>>> memset(&p->frame, 0, sizeof(AMRNBFrame));
>>> - for (i = 0; i < mode_bits[mode]; i++)
>>> - data[order[i].index] += get_bits1(&gb) << order[i].bit;
>>> + buf++;
>>> + while ((field_header = *order++)) {
>>> + int field = 0;
>>> + data += field_header >> 4;
>>> + field_header &= 0xf;
>>> + while (field_header--) {
>>> + int bit = *order++;
>>> + field <<= 1;
>>> + field |= buf[bit >> 3] >> (bit & 7) & 1;
>>> + }
>>> + *data = field;
>>> + }
>> I think that this is only guaranteed to work if you declare the AMRNBFrame
>> struct as packed, since the spec allows the compiler to add some padding
>> space inside structs otherwise.
>
> the struct contains only uint16_t fields, so this would seem odd to me if
> a compiler did it but iam not saying no compiler does ...
Is there any disadvantage in using "packed"?
-Vitor
More information about the FFmpeg-soc
mailing list