[Ffmpeg-devel] [PATCH] Base64 code

Ryan Martell rdm4
Sat Oct 28 00:07:21 CEST 2006


On Oct 27, 2006, at 1:47 PM, Michael Niedermayer wrote:
> [...]
>
>> #include "avformat.h"
>
> why is this needed?

uint8_t.  and av_log.

Replaced with common.h for uint8_t, and avutil.h (only if testing the  
base64 stuff)

>> #include "base64.h"
>>
>> /* ---------------- private code */
>> static uint8_t map2[] =
>>     { 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  
>> 0xff,
>>     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  
>> 0xff, 0xff,
>>         0xff, 0xff,
>>     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,  
>> 0xff, 0xff,
>>     0xff, 0xff,
>>     0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34,  
>> 0x35, 0x36,
>>     0x37, 0x38,
>>     0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff,  
>> 0xff, 0xff,
>>     0x00, 0x01,
>>     0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,  
>> 0x0c, 0x0d,
>>     0x0e, 0x0f,
>>     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,  
>> 0xff, 0xff,
>>     0xff, 0xff,
>>     0xff, 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,  
>> 0x22, 0x23,
>>     0x24, 0x25,
>>     0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,  
>> 0x30, 0x31,
>>     0x32, 0x33,
>>     0xff, 0xff, 0xff, 0xff, 0xff
>> };
>>
>> int b64_decode(uint8_t * out, const char *in, int out_length)
>
> both functions should have a av_ prefix, theres a pretty good  
> chance another
> application or lib might have a b64_decode() and if so the linker  
> would vomit

Done.

>> {
>>     int i, v;
>>     uint8_t *dst = out;
>>
>>     v = 0;
>>     for (i = 0; in[i] && in[i] != '='; i++) {
>>         if (in[i] < 0 || map2[(int) in[i]] == 0xff)
>>             return -1;
>
> char is unsigned on some platforms (the in[i] < 0 would be false and
> map2[(int) in[i]] would be outside of the array)

Didn't realize this; I took out the old check of greater than 127  
because i got a compiler warning about it being  always false.

>>         v = (v << 6) + map2[(int) in[i]];
>>         if (i & 3) {
>>             if (dst - out < out_length) {
>>                 *dst++ = v >> (6 - 2 * (i & 3));
>>             }
>>         }
>>     }
>>
>>     return (dst - out);
>
> what about
>
> static uint8_t map2[80] = {
>                       0x3e, 0xff, 0xff, 0xff, 0x3f,
>     0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
>     0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
>     0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
>     0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
>     0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
>     0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
>     0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
>     0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
>     0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
>     0x31, 0x32, 0x33
> };
>
> int av_b64_decode(uint8_t * out, const char *in, int out_length){
>     int i, v;
>     uint8_t *dst = out;
>
>     v = 0;
>     for (i = 0; in[i] && in[i] != '='; i++) {
>         unsigned int ndx= in[i]-43;
>         if (ndx > 79U || map2[ndx] == 0xff)
>             return -1;
>         v = (v << 6) + map2[ndx];
>         if (i & 3) {
>             if (dst - out < out_length) {
>                 *dst++ = v >> (6 - 2 * (i & 3));
>             }
>         }
>     }
>
>     return (dst - out);
> }
smaller static code blocks are better.  Done. (although I let the  
compiler count for me on the >79U part: sizeof(map2)/sizeof(map2[0])).

-------------- next part --------------
A non-text attachment was scrubbed...
Name: base64.c
Type: application/octet-stream
Size: 7270 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20061027/c80db2a5/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: base64.h
Type: application/octet-stream
Size: 1011 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20061027/c80db2a5/attachment-0001.obj>



More information about the ffmpeg-devel mailing list