seeds an AVLFG from binary data. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>tags/n3.3
@@ -15,6 +15,9 @@ libavutil: 2015-08-28 | |||||
API changes, most recent first: | API changes, most recent first: | ||||
2017-01-22 - xxxxxxx - lavu 55.44.100 - lfg.h | |||||
Add av_lfg_init_from_data(). | |||||
2017-01-xx - xxxxxxx - lavc 57.74.100 - vaapi.h | 2017-01-xx - xxxxxxx - lavc 57.74.100 - vaapi.h | ||||
Deprecate struct vaapi_context and the vaapi.h installed header. | Deprecate struct vaapi_context and the vaapi.h installed header. | ||||
Callers should set AVCodecContext.hw_frames_ctx instead. | Callers should set AVCodecContext.hw_frames_ctx instead. | ||||
@@ -23,7 +23,9 @@ | |||||
#include <limits.h> | #include <limits.h> | ||||
#include <math.h> | #include <math.h> | ||||
#include "lfg.h" | #include "lfg.h" | ||||
#include "crc.h" | |||||
#include "md5.h" | #include "md5.h" | ||||
#include "error.h" | |||||
#include "intreadwrite.h" | #include "intreadwrite.h" | ||||
#include "attributes.h" | #include "attributes.h" | ||||
@@ -58,3 +60,28 @@ void av_bmg_get(AVLFG *lfg, double out[2]) | |||||
out[0] = x1 * w; | out[0] = x1 * w; | ||||
out[1] = x2 * w; | out[1] = x2 * w; | ||||
} | } | ||||
int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length) { | |||||
unsigned int beg, end, segm; | |||||
const AVCRC *avcrc; | |||||
uint32_t crc = 1; | |||||
/* avoid integer overflow in the loop below. */ | |||||
if (length > (UINT_MAX / 128U)) return AVERROR(EINVAL); | |||||
c->index = 0; | |||||
avcrc = av_crc_get_table(AV_CRC_32_IEEE); /* This can't fail. It's a well-defined table in crc.c */ | |||||
/* across 64 segments of the incoming data, | |||||
* do a running crc of each segment and store the crc as the state for that slot. | |||||
* this works even if the length of the segment is 0 bytes. */ | |||||
beg = 0; | |||||
for (segm = 0;segm < 64;segm++) { | |||||
end = (((segm + 1) * length) / 64); | |||||
crc = av_crc(avcrc, crc, data + beg, end - beg); | |||||
c->state[segm] = (unsigned int)crc; | |||||
beg = end; | |||||
} | |||||
return 0; | |||||
} |
@@ -22,6 +22,8 @@ | |||||
#ifndef AVUTIL_LFG_H | #ifndef AVUTIL_LFG_H | ||||
#define AVUTIL_LFG_H | #define AVUTIL_LFG_H | ||||
#include <stdint.h> | |||||
typedef struct AVLFG { | typedef struct AVLFG { | ||||
unsigned int state[64]; | unsigned int state[64]; | ||||
int index; | int index; | ||||
@@ -29,6 +31,13 @@ typedef struct AVLFG { | |||||
void av_lfg_init(AVLFG *c, unsigned int seed); | void av_lfg_init(AVLFG *c, unsigned int seed); | ||||
/** | |||||
* Seed the state of the ALFG using binary data. | |||||
* | |||||
* Return value: 0 on success, negative value (AVERROR) on failure. | |||||
*/ | |||||
int av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length); | |||||
/** | /** | ||||
* Get the next random unsigned 32-bit number using an ALFG. | * Get the next random unsigned 32-bit number using an ALFG. | ||||
* | * | ||||
@@ -79,7 +79,7 @@ | |||||
*/ | */ | ||||
#define LIBAVUTIL_VERSION_MAJOR 55 | #define LIBAVUTIL_VERSION_MAJOR 55 | ||||
#define LIBAVUTIL_VERSION_MINOR 43 | |||||
#define LIBAVUTIL_VERSION_MINOR 44 | |||||
#define LIBAVUTIL_VERSION_MICRO 100 | #define LIBAVUTIL_VERSION_MICRO 100 | ||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||