69 int shift =
av_log2(denom - 1) + 1;
70 uint64_t ret = (1ULL << 52) / denom;
71 uint64_t err = (1ULL << 52) - ret * denom;
75 return ret + err / denom;
88 uint64_t l = x * (mantissa & 0xffffffff);
89 uint64_t h = x * (mantissa >> 32);
99 return (x << 1) ^ (x >> 7);
104 static const uint8_t series[] = { 1, 2, 3, 5, 8, 13, 21 };
111 for (i = 0; i < 7; i++) {
120 if (bits < 0 || bits > 31) {
123 }
else if (bits == 0) {
138 int i, j, scale_factor;
139 unsigned prob, cumulative_target;
140 unsigned cumul_prob = 0;
141 unsigned scaled_cumul_prob = 0;
144 rac->
prob[257] = UINT_MAX;
146 for (i = 1; i < 257; i++) {
151 if ((uint64_t)cumul_prob + rac->
prob[i] > UINT_MAX) {
155 cumul_prob += rac->
prob[i];
163 for (j = 0; j < prob; j++)
174 scale_factor =
av_log2(cumul_prob);
176 if (cumul_prob & (cumul_prob - 1)) {
178 for (i = 1; i < 257; i++) {
180 scaled_cumul_prob += rac->
prob[i];
184 cumulative_target = 1 << scale_factor;
186 if (scaled_cumul_prob > cumulative_target) {
188 "Scaled probabilities are larger than target!\n");
192 scaled_cumul_prob = cumulative_target - scaled_cumul_prob;
194 for (i = 1; scaled_cumul_prob; i = (i & 0x7f) + 1) {
213 rac->
scale = scale_factor;
216 for (i = 1; i < 257; i++)
223 uint8_t *diff,
int w,
int *left,
236 for (i = 0; i < w; i++) {
237 l =
mid_pred(l, src1[i], l + src1[i] - lt) + diff[i];
257 L = buf[width - stride - 1];
265 TL = buf[width - (2 *
stride) - 1];
288 const int HEAD = is_luma ? 4 : 2;
291 L = buf[width - stride - 1];
292 TL = buf[HEAD - stride - 1];
293 for (i = 0; i < HEAD; i++) {
300 TL = buf[width - (2 *
stride) - 1];
301 L = buf[width - stride - 1];
321 memset(dst + i, 0, count);
336 if (l->
zeros == esc_count) {
351 int width,
int esc_count)
356 const uint8_t *src_start = src;
357 uint8_t mask1 = -(esc_count < 2);
358 uint8_t mask2 = -(esc_count < 3);
359 uint8_t *end = dst + (width - 2);
364 if (end - dst < count) {
369 memset(dst, 0, count);
376 while (!zero_run && dst + i < end) {
378 if (src + i >= src_end)
381 !(src[i] | (src[i + 1] & mask1) | (src[i + 2] & mask2));
398 return src_start - src;
405 const uint8_t *src,
int src_size)
411 int esc_count = src[0];
414 const uint8_t *src_end = src + src_size;
421 if (esc_count &&
AV_RL32(src + 1) < length) {
433 for (i = 0; i <
height; i++)
439 "Output more bytes than length (%d of %d)\n", read,
441 }
else if (esc_count < 8) {
445 for (i = 0; i <
height; i++) {
447 src_end, width, esc_count);
453 if (src_size < width * height)
456 for (i = 0; i <
height; i++) {
457 memcpy(dst + (i * stride), src, width);
461 }
else if (esc_count == 0xff) {
463 for (i = 0; i <
height; i++)
464 memset(dst + i * stride, src[1], width);
471 "Invalid zero run escape code! (%#x)\n", esc_count);
476 for (i = 0; i <
height; i++) {
481 for (i = 0; i <
height; i++) {
503 int buf_size = avpkt->
size;
507 uint32_t offset_gu = 0, offset_bv = 0, offset_ry = 9;
510 int i, j, planes = 3;
535 for (j = 0; j < avctx->
height; j++) {
536 for (i = 0; i < avctx->
width; i++)
537 AV_WN32(dst + i * 4, offset_gu);
568 for (i = 0; i < planes; i++)
570 if (offset_ry >= buf_size ||
571 offset_gu >= buf_size ||
572 offset_bv >= buf_size ||
573 (planes == 4 && offs[3] >= buf_size)) {
575 "Invalid frame offsets\n");
578 for (i = 0; i < planes; i++)
584 for (i = 0; i < planes; i++)
587 for (i = 0; i < avctx->
width; i++) {
604 for (i = 0; i < planes; i++)
616 if (offset_ry >= buf_size ||
617 offset_gu >= buf_size ||
618 offset_bv >= buf_size) {
620 "Invalid frame offsets\n");
626 buf_size - offset_ry);
629 buf + offset_gu, buf_size - offset_gu);
632 buf + offset_bv, buf_size - offset_bv);
642 if (offset_ry >= buf_size ||
643 offset_gu >= buf_size ||
644 offset_bv >= buf_size) {
646 "Invalid frame offsets\n");
652 buf_size - offset_ry);
655 buf + offset_gu, buf_size - offset_gu);
658 buf + offset_bv, buf_size - offset_bv);
662 "Unsupported Lagarith frame type: %#x\n", frametype);
static uint8_t lag_get_rac(lag_rac *l)
Decode a single byte from the compressed plane described by *l.
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
This structure describes decoded (raw) audio or video data.
void ff_lag_rac_init(lag_rac *l, GetBitContext *gb, int length)
packed RGB 8:8:8, 24bpp, RGBRGB...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst, int width, int height, int stride, const uint8_t *src, int src_size)
int zeros
number of consecutive zero bytes encountered
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
AVCodec ff_lagarith_decoder
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
static int lag_decode_zero_run_line(LagarithContext *l, uint8_t *dst, const uint8_t *src, const uint8_t *src_end, int width, int esc_count)
solid grayscale color frame
static void lag_pred_line(LagarithContext *l, uint8_t *buf, int width, int stride, int line)
int zeros_rem
number of zero bytes remaining to output
unsigned scale
Number of bits of precision in range.
bitstream reader API header.
static int init(AVCodecParserContext *s)
struct LagarithContext LagarithContext
Multithreading support functions.
int reference
is this picture used as reference The values for this are the same as the MpegEncContext.picture_structure variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
static void add_lag_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *diff, int w, int *left, int *left_top)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_log(void *avcl, int level, const char *fmt,...)
int(* add_hfyu_left_prediction)(uint8_t *dst, const uint8_t *src, int w, int left)
const char * name
Name of the codec implementation.
static av_cold int lag_decode_init(AVCodecContext *avctx)
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
void(* add_hfyu_median_prediction)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top)
static uint64_t softfloat_reciprocal(uint32_t denom)
Compute the 52bit mantissa of 1/(double)denom.
obsolete arithmetic coded RGB (no longer encoded by upstream since version 1.1.0) ...
int width
picture width / height.
#define CODEC_CAP_FRAME_THREADS
static int lag_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Decode a frame.
static int lag_decode_prob(GetBitContext *gb, uint32_t *value)
static int lag_decode_line(LagarithContext *l, lag_rac *rac, uint8_t *dst, int width, int stride, int esc_count)
uint32_t prob[258]
Table of cumulative probability for each symbol.
int linesize[AV_NUM_DATA_POINTERS]
Size, in bytes, of the data for each picture/channel plane.
static uint32_t softfloat_mul(uint32_t x, uint64_t mantissa)
(uint32_t)(x*f), where f has the given mantissa, and exponent 0 Used in combination with softfloat_re...
main external API structure.
static void close(AVCodecParserContext *s)
#define MKBETAG(a, b, c, d)
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
static av_cold int lag_decode_end(AVCodecContext *avctx)
#define AVERROR_INVALIDDATA
solid non-grayscale color frame
static uint8_t lag_calc_zero_run(int8_t x)
static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf, int width, int stride, int line, int is_luma)
int key_frame
1 -> keyframe, 0-> not
reduced resolution YV12 frame
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f)
Wrapper around get_buffer() for frame-multithreaded codecs.
This structure stores compressed data.
void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f)
Wrapper around release_buffer() frame-for multithreaded codecs.