/*
* Copyright ( c ) 2006 Ryan Martell . ( rdm4 @ martellventures . com )
*
* This file is part of FFmpeg .
*
* FFmpeg is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2 . 1 of the License , or ( at your option ) any later version .
*
* FFmpeg is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
/**
* @ file
* @ brief Base64 encode / decode
* @ author Ryan Martell < rdm4 @ martellventures . com > ( with lots of Michael )
*/
#include <limits.h>
#include <stddef.h>
#include "base64.h"
#include "error.h"
#include "intreadwrite.h"
/* ---------------- private code */
static const uint8_t map2[256 ] =
{
0 xfe, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff,
0 x3e, 0 xff, 0 xff, 0 xff, 0 x3f, 0 x34, 0 x35, 0 x36,
0 x37, 0 x38, 0 x39, 0 x3a, 0 x3b, 0 x3c, 0 x3d, 0 xff,
0 xff, 0 xff, 0 xfe, 0 xff, 0 xff, 0 xff, 0 x00, 0 x01,
0 x02, 0 x03, 0 x04, 0 x05, 0 x06, 0 x07, 0 x08, 0 x09,
0 x0a, 0 x0b, 0 x0c, 0 x0d, 0 x0e, 0 x0f, 0 x10, 0 x11,
0 x12, 0 x13, 0 x14, 0 x15, 0 x16, 0 x17, 0 x18, 0 x19,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 x1a, 0 x1b,
0 x1c, 0 x1d, 0 x1e, 0 x1f, 0 x20, 0 x21, 0 x22, 0 x23,
0 x24, 0 x25, 0 x26, 0 x27, 0 x28, 0 x29, 0 x2a, 0 x2b,
0 x2c, 0 x2d, 0 x2e, 0 x2f, 0 x30, 0 x31, 0 x32, 0 x33,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff,
};
#define BASE64_DEC_STEP(i) do { \
bits = map2[in[i]]; \
if (bits & 0 x80) \
goto out ## i; \
v = i ? (v << 6 ) + bits : bits; \
} while (0 )
int av_base64_decode(uint8_t *out, const char *in_str, int out_size)
{
uint8_t *dst = out;
uint8_t *end;
// no sign extension
const uint8_t *in = in_str;
unsigned bits = 0 xff;
unsigned v;
if (!out)
goto validity_check;
end = out + out_size;
while (end - dst > 3 ) {
BASE64_DEC_STEP(0 );
BASE64_DEC_STEP(1 );
BASE64_DEC_STEP(2 );
BASE64_DEC_STEP(3 );
// Using AV_WB32 directly confuses compiler
v = av_be2ne32(v << 8 );
AV_WN32(dst, v);
dst += 3 ;
in += 4 ;
}
if (end - dst) {
BASE64_DEC_STEP(0 );
BASE64_DEC_STEP(1 );
BASE64_DEC_STEP(2 );
BASE64_DEC_STEP(3 );
*dst++ = v >> 16 ;
if (end - dst)
*dst++ = v >> 8 ;
if (end - dst)
*dst++ = v;
in += 4 ;
}
validity_check:
while (1 ) {
BASE64_DEC_STEP(0 );
in++;
BASE64_DEC_STEP(0 );
in++;
BASE64_DEC_STEP(0 );
in++;
BASE64_DEC_STEP(0 );
in++;
}
out3:
if (end - dst)
*dst++ = v >> 10 ;
v <<= 2 ;
out2:
if (end - dst)
*dst++ = v >> 4 ;
out1:
out0:
return bits & 1 ? AVERROR_INVALIDDATA : out ? dst - out : 0 ;
}
/*****************************************************************************
* b64_encode : Stolen from VLC ' s http . c .
* Simplified by Michael .
* Fixed edge cases and made it work from data ( vs . strings ) by Ryan .
*****************************************************************************/
char *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
{
static const char b64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ;
char *ret, *dst;
unsigned i_bits = 0 ;
int i_shift = 0 ;
int bytes_remaining = in_size;
if (in_size >= UINT_MAX / 4 ||
out_size < AV_BASE64_SIZE(in_size))
return NULL;
ret = dst = out;
while (bytes_remaining > 3 ) {
i_bits = AV_RB32(in);
in += 3 ; bytes_remaining -= 3 ;
*dst++ = b64[ i_bits>>26 ];
*dst++ = b64[(i_bits>>20 ) & 0 x3F];
*dst++ = b64[(i_bits>>14 ) & 0 x3F];
*dst++ = b64[(i_bits>>8 ) & 0 x3F];
}
i_bits = 0 ;
while (bytes_remaining) {
i_bits = (i_bits << 8 ) + *in++;
bytes_remaining--;
i_shift += 8 ;
}
while (i_shift > 0 ) {
*dst++ = b64[(i_bits << 6 >> i_shift) & 0 x3f];
i_shift -= 6 ;
}
while ((dst - ret) & 3 )
*dst++ = '=' ;
*dst = '\0' ;
return ret;
}
Messung V0.5 in Prozent C=96 H=80 G=88
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-08-25)
¤
*© Formatika GbR, Deutschland