[FFmpeg-devel] [PATCH] new function get_sbits_long()
Måns Rullgård
mans
Tue Mar 3 02:45:46 CET 2009
Justin Ruggles <justin.ruggles at gmail.com> writes:
> Michael Niedermayer wrote:
>> On Mon, Mar 02, 2009 at 07:38:09PM -0500, Justin Ruggles wrote:
>>> M?ns Rullg?rd wrote:
>>>> Justin Ruggles <justin.ruggles at gmail.com> writes:
>>>>
>>>>> Reimar D?ffinger wrote:
>>>>>> On Mon, Mar 02, 2009 at 01:35:45PM -0500, Justin Ruggles wrote:
>>>>>>> Reimar D?ffinger wrote:
>>>>>>>> On Mon, Mar 02, 2009 at 06:58:49PM +0100, Michael Niedermayer wrote:
>>>>>>>>> On Mon, Mar 02, 2009 at 12:39:05PM -0500, Justin Ruggles wrote:
>>>>>>>>>> I need a get_sbits_long() function to support FLAC files that are more
>>>>>>>>>> than 24-bit. There might be a better way to do it, but this works.
>>>>>>>>> only where int is 32bit which isnt guranteed even if likely
>>>>>>>> There is already the NEG_SSR32 macro to take care of that (and it
>>>>>>>> also optimizes gcc's brain-deadness away on x86).
>>>>>>> yes, this works well.
>>>>>>>
>>>>>>> -Justin
>>>>>>>
>>>>>>> Index: libavcodec/bitstream.h
>>>>>>> ===================================================================
>>>>>>> --- libavcodec/bitstream.h (revision 17735)
>>>>>>> +++ libavcodec/bitstream.h (working copy)
>>>>>>> @@ -707,6 +707,14 @@
>>>>>>> }
>>>>>>>
>>>>>>> /**
>>>>>>> + * reads 0-32 bits as a signed integer.
>>>>>>> + */
>>>>>>> +static inline int get_sbits_long(GetBitContext *s, int n) {
>>>>>>> + int val = get_bits_long(s, n);
>>>>>>> + return NEG_SSR32(val, n);
>>>>>> Can't imagine that, you must use it like in the SHOW_SBITS macro:
>>>>>> NEG_SSR32(val<<(32-n), n)
>>>>> You're right. The FLAC file I tested just happened not to trigger any
>>>>> problem. I tried another one.
>>>>>
>>>>> -Justin
>>>>>
>>>>>
>>>>> Index: libavcodec/bitstream.h
>>>>> ===================================================================
>>>>> --- libavcodec/bitstream.h (revision 17735)
>>>>> +++ libavcodec/bitstream.h (working copy)
>>>>> @@ -707,6 +707,14 @@
>>>>> }
>>>>>
>>>>> /**
>>>>> + * reads 0-32 bits as a signed integer.
>>>>> + */
>>>>> +static inline int get_sbits_long(GetBitContext *s, int n) {
>>>>> + int val = get_bits_long(s, n);
>>>>> + return NEG_SSR32(val<<(32-n), n);
>>>>> +}
>>>> This is obfuscation IMO. I'll prepare a patch adding a sign extend
>>>> function if nobody beats me to it. What is the preferred return type,
>>>> int or int32_t? I'd say int, but maybe there's a good reason for
>>>> something else.
>>> Thanks M?ns. Here is a patch using the new function in mathops.h.
>>
>> was there another file that needs get_sbits_long() ? if not this code
>> belongs in flac*
>
> It could be used in 1 place in alac.c:547:
> audiobits = get_bits_long(&alac->gb, alac->setinfo_sample_size);
> audiobits = extend_sign32(audiobits, alac->setinfo_sample_size);
>
> additionally, that extend_sign32() function, which is also used in other
> places in alac.c, could be replaced by calls to sign_extend() in mathops.h.
I posted a patch for that a while ago.
--
M?ns Rullg?rd
mans at mansr.com
More information about the ffmpeg-devel
mailing list