50#define CVID_HEADER_SIZE 10
51#define STRIP_HEADER_SIZE 12
52#define CHUNK_HEADER_SIZE 4
55#define MB_AREA (MB_SIZE * MB_SIZE)
58#define CODEBOOK_MAX 256
132#define OFFSET(x) offsetof(CinepakEncContext, x)
133#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
135 {
"max_extra_cb_iterations",
"Max extra codebook recalculation passes, more is better and slower",
137 {
"skip_empty_cb",
"Avoid wasting bytes, ignore vintage MacOS decoder",
139 {
"max_strips",
"Limit strips/frame, vintage compatible is 1..3, otherwise the more the better",
141 {
"min_strips",
"Enforce min strips/frame, more is worse and faster, must be <= max_strips",
143 {
"strip_number_adaptivity",
"How fast the strip number adapts, more is slightly better, much slower",
149 .class_name =
"cinepak",
158 int x, mb_count, strip_buf_size, frame_buf_size;
161 av_log(avctx,
AV_LOG_ERROR,
"width and height must be multiples of four (got %ix%i)\n",
166 if (
s->min_min_strips >
s->max_max_strips) {
167 av_log(avctx,
AV_LOG_ERROR,
"minimum number of strips must not exceed maximum (got %i and %i)\n",
168 s->min_min_strips,
s->max_max_strips);
202 if (!(
s->strip_buf =
av_malloc(strip_buf_size)))
205 if (!(
s->frame_buf =
av_malloc(frame_buf_size)))
215 s->frame_buf_size = frame_buf_size;
220 s->last_frame->data[0] =
s->pict_bufs[0];
221 s->last_frame->linesize[0] =
s->w;
222 s->best_frame->data[0] =
s->pict_bufs[1];
223 s->best_frame->linesize[0] =
s->w;
224 s->scratch_frame->data[0] =
s->pict_bufs[2];
225 s->scratch_frame->linesize[0] =
s->w;
228 s->last_frame->data[1] =
s->last_frame->data[0] +
s->w *
s->h;
229 s->last_frame->data[2] =
s->last_frame->data[1] + ((
s->w *
s->h) >> 2);
230 s->last_frame->linesize[1] =
231 s->last_frame->linesize[2] =
s->w >> 1;
233 s->best_frame->data[1] =
s->best_frame->data[0] +
s->w *
s->h;
234 s->best_frame->data[2] =
s->best_frame->data[1] + ((
s->w *
s->h) >> 2);
235 s->best_frame->linesize[1] =
236 s->best_frame->linesize[2] =
s->w >> 1;
238 s->scratch_frame->data[1] =
s->scratch_frame->data[0] +
s->w *
s->h;
239 s->scratch_frame->data[2] =
s->scratch_frame->data[1] + ((
s->w *
s->h) >> 2);
240 s->scratch_frame->linesize[1] =
241 s->scratch_frame->linesize[2] =
s->w >> 1;
243 s->input_frame->data[0] =
s->pict_bufs[3];
244 s->input_frame->linesize[0] =
s->w;
245 s->input_frame->data[1] =
s->input_frame->data[0] +
s->w *
s->h;
246 s->input_frame->data[2] =
s->input_frame->data[1] + ((
s->w *
s->h) >> 2);
247 s->input_frame->linesize[1] =
248 s->input_frame->linesize[2] =
s->w >> 1;
251 s->min_strips =
s->min_min_strips;
252 s->max_strips =
s->max_max_strips;
259 int *training_set_v1_shrunk,
260 int *training_set_v4_shrunk)
267 int64_t score1, score2, score3;
272 switch (info->
mode) {
275 ret +=
s->lambda * 8 * mb_count;
278 for (x = 0; x < mb_count; x++) {
291 *training_set_v1_shrunk = *training_set_v4_shrunk = 0;
292 for (x = 0; x < mb_count; x++) {
302 for (x = 0; x < mb_count; x++) {
307 if (score1 <= score2) {
321 int v1_shrunk = 0, v4_shrunk = 0;
322 for (x = 0; x < mb_count; x++) {
329 }
else if (
mb->best_encoding ==
ENC_V1) {
347 *training_set_v1_shrunk = v1_shrunk;
348 *training_set_v4_shrunk = v4_shrunk;
350 for (x = 0; x < mb_count; x++) {
356 if (score1 <= score2 && score1 <= score3) {
359 }
else if (score2 <= score3) {
383 int chunk_type_yuv,
int chunk_type_gray,
387 int incremental_codebook_replacement_mode = 0;
392 chunk_type_yuv + (incremental_codebook_replacement_mode ? 1 : 0) :
393 chunk_type_gray + (incremental_codebook_replacement_mode ? 1 : 0),
395 (incremental_codebook_replacement_mode ? (
size + 31) / 32 * 4 : 0));
402 if (incremental_codebook_replacement_mode) {
405 for (x = 0; x <
size; x++) {
412 for (y = 0; y < entry_size; y++)
413 buf[ret++] =
codebook[y + x * entry_size] ^ (y >= 4 ? 0x80 : 0);
414 if ((
flags & 0xffffffff) == 0xffffffff) {
422 for (x = 0; x <
size; x++)
423 for (y = 0; y < entry_size; y++)
424 buf[ret++] =
codebook[y + x * entry_size] ^ (y >= 4 ? 0x80 : 0);
431 uint8_t *
const in_data[4],
const int in_linesize[4],
432 uint8_t *out_data[4],
int out_linesize[4])
434 out_data[0] = in_data[0] + x + y * in_linesize[0];
435 out_linesize[0] = in_linesize[0];
438 out_data[1] = in_data[1] + (x >> 1) + (y >> 1) * in_linesize[1];
439 out_linesize[1] = in_linesize[1];
441 out_data[2] = in_data[2] + (x >> 1) + (y >> 1) * in_linesize[2];
442 out_linesize[2] = in_linesize[2];
448 int linesize[4],
int v1_vector,
strip_info *info)
454 data[0][ linesize[0]] =
459 data[0][2 + linesize[0]] =
460 data[0][3 + linesize[0]] = info->
v1_codebook[v1_vector * entry_size + 1];
462 data[0][ 2 * linesize[0]] =
463 data[0][1 + 2 * linesize[0]] =
464 data[0][ 3 * linesize[0]] =
465 data[0][1 + 3 * linesize[0]] = info->
v1_codebook[v1_vector * entry_size + 2];
467 data[0][2 + 2 * linesize[0]] =
468 data[0][3 + 2 * linesize[0]] =
469 data[0][2 + 3 * linesize[0]] =
470 data[0][3 + 3 * linesize[0]] = info->
v1_codebook[v1_vector * entry_size + 3];
475 data[1][ linesize[1]] =
476 data[1][1 + linesize[1]] = info->
v1_codebook[v1_vector * entry_size + 4];
480 data[2][ linesize[2]] =
481 data[2][1 + linesize[2]] = info->
v1_codebook[v1_vector * entry_size + 5];
487 int linesize[4],
int *v4_vector,
strip_info *info)
491 for (
i = y = 0; y < 4; y += 2) {
492 for (x = 0; x < 4; x += 2,
i++) {
493 data[0][x + y * linesize[0]] = info->
v4_codebook[v4_vector[
i] * entry_size];
494 data[0][x + 1 + y * linesize[0]] = info->
v4_codebook[v4_vector[
i] * entry_size + 1];
495 data[0][x + (y + 1) * linesize[0]] = info->
v4_codebook[v4_vector[
i] * entry_size + 2];
496 data[0][x + 1 + (y + 1) * linesize[0]] = info->
v4_codebook[v4_vector[
i] * entry_size + 3];
499 data[1][(x >> 1) + (y >> 1) * linesize[1]] = info->
v4_codebook[v4_vector[
i] * entry_size + 4];
500 data[2][(x >> 1) + (y >> 1) * linesize[2]] = info->
v4_codebook[v4_vector[
i] * entry_size + 5];
507 uint8_t *a_data[4],
int a_linesize[4],
508 uint8_t *b_data[4],
int b_linesize[4])
513 memcpy(a_data[0] + y * a_linesize[0], b_data[0] + y * b_linesize[0],
517 for (p = 1; p <= 2; p++)
518 for (y = 0; y <
MB_SIZE / 2; y++)
519 memcpy(a_data[p] + y * a_linesize[p],
520 b_data[p] + y * b_linesize[p],
526 uint8_t *scratch_data[4],
int scratch_linesize[4],
527 uint8_t *last_data[4],
int last_linesize[4],
530 int x, y, z,
bits, temp_size, header_ofs, ret = 0, mb_count =
s->w *
h /
MB_AREA;
531 int needs_extra_bit, should_write_temp;
533 unsigned char temp[64];
535 uint8_t *sub_scratch_data[4] = { 0 }, *sub_last_data[4] = { 0 };
536 int sub_scratch_linesize[4] = { 0 }, sub_last_linesize[4] = { 0 };
542 if (info->
v4_size || !
s->skip_empty_cb)
545 if (info->
v1_size || !
s->skip_empty_cb)
549 for (z = y = 0; y <
h; y +=
MB_SIZE)
550 for (x = 0; x <
s->w; x +=
MB_SIZE, z++) {
554 sub_scratch_data, sub_scratch_linesize);
558 sub_last_data, sub_last_linesize);
559 copy_mb(
s, sub_scratch_data, sub_scratch_linesize,
560 sub_last_data, sub_last_linesize);
563 mb->v1_vector, info);
566 mb->v4_vector, info);
569 switch (info->
mode) {
573 for (x = 0; x < mb_count; x++)
574 buf[ret++] =
s->mb[x].v1_vector;
582 for (x = 0; x < mb_count; x += 32) {
584 for (y = x; y <
FFMIN(x + 32, mb_count); y++)
585 if (
s->mb[y].best_encoding ==
ENC_V4)
586 flags |= 1U << (31 - y + x);
591 for (y = x; y <
FFMIN(x + 32, mb_count); y++) {
595 buf[ret++] =
mb->v1_vector;
597 for (z = 0; z < 4; z++)
598 buf[ret++] =
mb->v4_vector[z];
611 for (x = 0; x < mb_count; x++) {
615 should_write_temp = 0;
629 if (
mb->best_encoding ==
ENC_SKIP || needs_extra_bit) {
630 memcpy(&buf[ret],
temp, temp_size);
634 should_write_temp = 1;
637 if (needs_extra_bit) {
643 temp[temp_size++] =
mb->v1_vector;
644 else if (
mb->best_encoding ==
ENC_V4)
645 for (z = 0; z < 4; z++)
646 temp[temp_size++] =
mb->v4_vector[z];
648 if (should_write_temp) {
649 memcpy(&buf[ret],
temp, temp_size);
658 memcpy(&buf[ret],
temp, temp_size);
672 uint8_t *a_data[4],
int a_linesize[4],
673 uint8_t *b_data[4],
int b_linesize[4])
675 int x, y, p, d, ret = 0;
678 for (x = 0; x <
MB_SIZE; x++) {
679 d = a_data[0][x + y * a_linesize[0]] - b_data[0][x + y * b_linesize[0]];
684 for (p = 1; p <= 2; p++) {
685 for (y = 0; y <
MB_SIZE / 2; y++)
686 for (x = 0; x <
MB_SIZE / 2; x++) {
687 d = a_data[p][x + y * a_linesize[p]] - b_data[p][x + y * b_linesize[p]];
697#define CERTAIN(x) ((x) != ENC_UNCERTAIN)
699 int linesize[4],
int v1mode,
strip_info *info,
702 int x, y,
i, j, k, x2, y2, x3, y3, plane,
shift, mbn;
706 uint8_t vq_pict_buf[(
MB_AREA * 3) / 2];
707 uint8_t *sub_data[4], *vq_data[4];
708 int sub_linesize[4], vq_linesize[4];
711 for (mbn =
i = y = 0; y <
h; y +=
MB_SIZE) {
712 for (x = 0; x <
s->w; x +=
MB_SIZE, ++mbn) {
717 if (
s->mb[mbn].best_encoding != encoding)
721 base =
s->codebook_input +
i * entry_size;
724 for (j = y2 = 0; y2 < entry_size; y2 += 2)
725 for (x2 = 0; x2 < 4; x2 += 2, j++) {
726 plane = y2 < 4 ? 0 : 1 + (x2 >> 1);
727 shift = y2 < 4 ? 0 : 1;
731 data[plane][((x + x3) >>
shift) + 1 + ((y + y3) >>
shift) * linesize[plane]] +
732 data[plane][((x + x3) >>
shift) + (((y + y3) >>
shift) + 1) * linesize[plane]] +
733 data[plane][((x + x3) >>
shift) + 1 + (((y + y3) >>
shift) + 1) * linesize[plane]]) >> 2;
737 for (j = y2 = 0; y2 <
MB_SIZE; y2 += 2) {
738 for (x2 = 0; x2 <
MB_SIZE; x2 += 2)
739 for (k = 0; k < entry_size; k++, j++) {
740 plane = k >= 4 ? k - 3 : 0;
746 x3 = x + x2 + (k & 1);
747 y3 = y + y2 + (k >> 1);
750 base[j] =
data[plane][x3 + y3 * linesize[plane]];
764 size, 1,
s->codebook_closest, &
s->randctx, 0);
769 vq_data[0] = vq_pict_buf;
771 vq_data[1] = &vq_pict_buf[
MB_AREA];
772 vq_data[2] = vq_data[1] + (
MB_AREA >> 2);
778 for (x = 0; x <
s->w; x +=
MB_SIZE, j++) {
781 if (
CERTAIN(encoding) &&
mb->best_encoding != encoding)
788 mb->v1_vector =
s->codebook_closest[
i];
794 vq_data, vq_linesize);
796 for (k = 0; k < 4; k++)
797 mb->v4_vector[k] =
s->codebook_closest[
i + k];
803 vq_data, vq_linesize);
814 uint8_t *last_data[4],
int last_linesize[4],
815 uint8_t *
data[4],
int linesize[4],
819 uint8_t *sub_last_data [4], *sub_pict_data [4];
820 int sub_last_linesize[4], sub_pict_linesize[4];
823 for (x = 0; x <
s->w; x +=
MB_SIZE,
i++) {
825 sub_last_data, sub_last_linesize);
827 sub_pict_data, sub_pict_linesize);
829 s->mb[
i].skip_error =
831 sub_last_data, sub_last_linesize,
832 sub_pict_data, sub_pict_linesize);
843 buf[0] = keyframe ? 0x10 : 0x11;
847 unsigned char *buf,
int strip_size)
860 uint8_t *last_data[4],
int last_linesize[4],
861 uint8_t *
data[4],
int linesize[4],
862 uint8_t *scratch_data[4],
int scratch_linesize[4],
863 unsigned char *buf,
int64_t *best_score,
int *no_skip)
869 int v1enough, v1_size, v4enough, v4_size;
870 int new_v1_size, new_v4_size;
871 int v1shrunk, v4shrunk;
881#define SMALLEST_CODEBOOK 1
924 &v1shrunk, &v4shrunk);
927 int extra_iterations_limit =
s->max_extra_cb_iterations;
934 if (new_v1_size < info.
v1_size)
941 if (new_v4_size < info.
v4_size)
949 &v1shrunk, &v4shrunk);
951 if ((!v1shrunk && !v4shrunk) || !extra_iterations_limit--)
959 if (new_v1_size < info.
v1_size)
967 if (new_v4_size < info.
v4_size)
973 if (best_size == 0 || score < *best_score) {
976 scratch_data, scratch_linesize,
977 last_data, last_linesize, &info,
990 memcpy(buf,
s->strip_buf, best_size);
996 int num_strips,
int data_size,
int isakeyframe)
998 buf[0] = isakeyframe ? 0 : 1;
1008 int isakeyframe,
unsigned char *buf,
int buf_size,
int *got_keyframe)
1010 int num_strips, strip,
i, y, nexty,
size, temp_size, best_size;
1011 uint8_t *last_data [4], *
data [4], *scratch_data [4];
1012 int last_linesize[4], linesize[4], scratch_linesize[4];
1013 int64_t best_score = 0, score, score_temp;
1014 int best_nstrips, best_strip_offsets[
MAX_STRIPS];
1019 for (y = 0; y <
s->h; y += 2)
1020 for (x = 0; x <
s->w; x += 2) {
1021 const uint8_t *ir[2];
1023 ir[0] =
frame->data[0] + x * 3 + y *
frame->linesize[0];
1024 ir[1] = ir[0] +
frame->linesize[0];
1026 s->input_frame->data,
s->input_frame->linesize,
1027 scratch_data, scratch_linesize);
1029 for (
i = 0;
i < 4; ++
i) {
1033 rr = ir[i2][i1 * 3 + 0];
1034 gg = ir[i2][i1 * 3 + 1];
1035 bb = ir[i2][i1 * 3 + 2];
1042 rr = (2396625 * rr + 4793251 * gg + 1198732 * bb) >> 23;
1047 scratch_data[0][i1 + i2 * scratch_linesize[0]] = rr;
1053 rr = (-299683 *
r - 599156 *
g + 898839 *
b) >> 23;
1058 scratch_data[1][0] = rr + 128;
1061 rr = (748893 *
r - 599156 *
g - 149737 *
b) >> 23;
1066 scratch_data[2][0] = rr + 128;
1072 for (num_strips =
s->min_strips; num_strips <= s->max_strips && num_strips <= s->
h /
MB_SIZE; num_strips++) {
1074 int all_no_skip = 1;
1078 for (y = 0, strip = 1; y <
s->h; strip++, y = nexty) {
1079 int strip_height, no_skip;
1082 nexty = strip *
s->h / num_strips;
1085 nexty += 4 - (nexty & 3);
1087 strip_height = nexty - y;
1088 if (strip_height <= 0) {
1089 av_log(
s->avctx,
AV_LOG_INFO,
"skipping zero height strip %i of %i\n", strip, num_strips);
1095 s->input_frame->data,
s->input_frame->linesize,
1102 s->last_frame->data,
s->last_frame->linesize,
1103 last_data, last_linesize);
1105 s->scratch_frame->data,
s->scratch_frame->linesize,
1106 scratch_data, scratch_linesize);
1108 if ((temp_size =
rd_strip(
s, y, strip_height, isakeyframe,
1109 last_data, last_linesize,
data, linesize,
1110 scratch_data, scratch_linesize,
1111 s->frame_buf + strip_offsets[strip-1],
1112 &score_temp, &no_skip)) < 0)
1115 score += score_temp;
1117 all_no_skip &= no_skip;
1120 if (best_score == 0 || score < best_score) {
1125 memcpy(buf,
s->frame_buf, best_size);
1126 best_nstrips = num_strips;
1127 *got_keyframe = all_no_skip;
1128 memcpy(best_strip_offsets, strip_offsets,
sizeof(strip_offsets));
1132 if (num_strips - best_nstrips > 4)
1137 for (
i = 0;
i < best_nstrips;
i++) {
1144 if (!
s->strip_number_delta_range) {
1145 if (best_nstrips ==
s->max_strips) {
1146 s->max_strips = best_nstrips + 1;
1147 if (
s->max_strips >=
s->max_max_strips)
1148 s->max_strips =
s->max_max_strips;
1150 s->max_strips = best_nstrips;
1152 s->min_strips =
s->max_strips - 1;
1153 if (
s->min_strips <
s->min_min_strips)
1154 s->min_strips =
s->min_min_strips;
1156 s->max_strips = best_nstrips +
s->strip_number_delta_range;
1157 if (
s->max_strips >=
s->max_max_strips)
1158 s->max_strips =
s->max_max_strips;
1159 s->min_strips = best_nstrips -
s->strip_number_delta_range;
1160 if (
s->min_strips <
s->min_min_strips)
1161 s->min_strips =
s->min_min_strips;
1171 int ret, got_keyframe;
1177 ret =
rd_frame(
s,
frame, (
s->curframe == 0),
pkt->data,
s->frame_buf_size, &got_keyframe);
1217 .p.name =
"cinepak",
const FFCodec ff_cinepak_encoder
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static const unsigned codebook[256][2]
static void decode_v1_vector(CinepakEncContext *s, uint8_t *data[4], int linesize[4], int v1_vector, strip_info *info)
static int cinepak_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
#define STRIP_HEADER_SIZE
static void get_sub_picture(CinepakEncContext *s, int x, int y, uint8_t *const in_data[4], const int in_linesize[4], uint8_t *out_data[4], int out_linesize[4])
static void write_strip_header(CinepakEncContext *s, int y, int h, int keyframe, unsigned char *buf, int strip_size)
#define CHUNK_HEADER_SIZE
static int encode_mode(CinepakEncContext *s, int h, uint8_t *scratch_data[4], int scratch_linesize[4], uint8_t *last_data[4], int last_linesize[4], strip_info *info, unsigned char *buf)
static int compute_mb_distortion(CinepakEncContext *s, uint8_t *a_data[4], int a_linesize[4], uint8_t *b_data[4], int b_linesize[4])
static int rd_strip(CinepakEncContext *s, int y, int h, int keyframe, uint8_t *last_data[4], int last_linesize[4], uint8_t *data[4], int linesize[4], uint8_t *scratch_data[4], int scratch_linesize[4], unsigned char *buf, int64_t *best_score, int *no_skip)
#define SMALLEST_CODEBOOK
static int rd_frame(CinepakEncContext *s, const AVFrame *frame, int isakeyframe, unsigned char *buf, int buf_size, int *got_keyframe)
static int write_cvid_header(CinepakEncContext *s, unsigned char *buf, int num_strips, int data_size, int isakeyframe)
static void write_strip_keyframe(unsigned char *buf, int keyframe)
static int quantize(CinepakEncContext *s, int h, uint8_t *data[4], int linesize[4], int v1mode, strip_info *info, mb_encoding encoding)
static int64_t calculate_mode_score(CinepakEncContext *s, int h, strip_info *info, int report, int *training_set_v1_shrunk, int *training_set_v4_shrunk)
static void calculate_skip_errors(CinepakEncContext *s, int h, uint8_t *last_data[4], int last_linesize[4], uint8_t *data[4], int linesize[4], strip_info *info)
static void decode_v4_vector(CinepakEncContext *s, uint8_t *data[4], int linesize[4], int *v4_vector, strip_info *info)
static int encode_codebook(CinepakEncContext *s, int *codebook, int size, int chunk_type_yuv, int chunk_type_gray, unsigned char *buf)
static void copy_mb(CinepakEncContext *s, uint8_t *a_data[4], int a_linesize[4], uint8_t *b_data[4], int b_linesize[4])
static int write_chunk_header(unsigned char *buf, int chunk_type, int chunk_size)
static const AVClass cinepak_class
static av_cold int cinepak_encode_init(AVCodecContext *avctx)
static av_cold int cinepak_encode_end(AVCodecContext *avctx)
#define CODEC_PIXFMTS(...)
#define FF_CODEC_ENCODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
int(* init)(AVBSFContext *ctx)
int avpriv_elbg_do(ELBGContext **elbgp, int *points, int dim, int numpoints, int *codebook, int num_cb, int max_steps, int *closest_cb, AVLFG *rand_state, uintptr_t flags)
Implementation of the Enhanced LBG Algorithm Based on the paper "Neural Networks 14:1219-1237" that c...
av_cold void avpriv_elbg_free(ELBGContext **elbgp)
Free an ELBGContext and reset the pointer to it.
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
static const uint8_t bits[8]
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
#define LIBAVUTIL_VERSION_INT
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
static int shift(int a, int b)
#define FFSWAP(type, a, b)
Memory handling functions.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Describe the class of an AVClass context structure.
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
This structure describes decoded (raw) audio or video data.
Context structure for the Lagged Fibonacci PRNG.
This structure stores compressed data.
unsigned char * pict_bufs[4]
unsigned char * frame_buf
struct ELBGContext * elbg
unsigned char * strip_buf
int strip_number_delta_range
enum AVPixelFormat pix_fmt
int max_extra_cb_iterations
mb_encoding best_encoding
int v4_codebook[CODEBOOK_MAX *VECTOR_MAX]
int v1_codebook[CODEBOOK_MAX *VECTOR_MAX]
#define av_malloc_array(a, b)