51 #define CVID_HEADER_SIZE 10
52 #define STRIP_HEADER_SIZE 12
53 #define CHUNK_HEADER_SIZE 4
55 #define MB_SIZE 4 //4x4 MBs
56 #define MB_AREA (MB_SIZE * MB_SIZE)
58 #define VECTOR_MAX 6 // six or four entries per vector depending on format
59 #define CODEBOOK_MAX 256 // size of a codebook
61 #define MAX_STRIPS 32 // Note: having fewer choices regarding the number of strips speeds up encoding (obviously)
62 #define MIN_STRIPS 1 // Note: having more strips speeds up encoding the frame (this is less obvious)
133 #define OFFSET(x) offsetof(CinepakEncContext, x)
134 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
136 {
"max_extra_cb_iterations",
"Max extra codebook recalculation passes, more is better and slower",
138 {
"skip_empty_cb",
"Avoid wasting bytes, ignore vintage MacOS decoder",
140 {
"max_strips",
"Limit strips/frame, vintage compatible is 1..3, otherwise the more the better",
142 {
"min_strips",
"Enforce min strips/frame, more is worse and faster, must be <= max_strips",
144 {
"strip_number_adaptivity",
"How fast the strip number adapts, more is slightly better, much slower",
159 int x, mb_count, strip_buf_size, frame_buf_size;
162 av_log(avctx,
AV_LOG_ERROR,
"width and height must be multiples of four (got %ix%i)\n",
167 if (
s->min_min_strips >
s->max_max_strips) {
168 av_log(avctx,
AV_LOG_ERROR,
"minimum number of strips must not exceed maximum (got %i and %i)\n",
169 s->min_min_strips,
s->max_max_strips);
203 if (!(
s->strip_buf =
av_malloc(strip_buf_size)))
206 if (!(
s->frame_buf =
av_malloc(frame_buf_size)))
216 s->frame_buf_size = frame_buf_size;
221 s->last_frame->data[0] =
s->pict_bufs[0];
222 s->last_frame->linesize[0] =
s->w;
223 s->best_frame->data[0] =
s->pict_bufs[1];
224 s->best_frame->linesize[0] =
s->w;
225 s->scratch_frame->data[0] =
s->pict_bufs[2];
226 s->scratch_frame->linesize[0] =
s->w;
229 s->last_frame->data[1] =
s->last_frame->data[0] +
s->w *
s->h;
230 s->last_frame->data[2] =
s->last_frame->data[1] + ((
s->w *
s->h) >> 2);
231 s->last_frame->linesize[1] =
232 s->last_frame->linesize[2] =
s->w >> 1;
234 s->best_frame->data[1] =
s->best_frame->data[0] +
s->w *
s->h;
235 s->best_frame->data[2] =
s->best_frame->data[1] + ((
s->w *
s->h) >> 2);
236 s->best_frame->linesize[1] =
237 s->best_frame->linesize[2] =
s->w >> 1;
239 s->scratch_frame->data[1] =
s->scratch_frame->data[0] +
s->w *
s->h;
240 s->scratch_frame->data[2] =
s->scratch_frame->data[1] + ((
s->w *
s->h) >> 2);
241 s->scratch_frame->linesize[1] =
242 s->scratch_frame->linesize[2] =
s->w >> 1;
244 s->input_frame->data[0] =
s->pict_bufs[3];
245 s->input_frame->linesize[0] =
s->w;
246 s->input_frame->data[1] =
s->input_frame->data[0] +
s->w *
s->h;
247 s->input_frame->data[2] =
s->input_frame->data[1] + ((
s->w *
s->h) >> 2);
248 s->input_frame->linesize[1] =
249 s->input_frame->linesize[2] =
s->w >> 1;
252 s->min_strips =
s->min_min_strips;
253 s->max_strips =
s->max_max_strips;
260 int *training_set_v1_shrunk,
261 int *training_set_v4_shrunk)
268 int64_t score1, score2, score3;
273 switch (
info->mode) {
276 ret +=
s->lambda * 8 * mb_count;
279 for (x = 0; x < mb_count; x++) {
292 *training_set_v1_shrunk = *training_set_v4_shrunk = 0;
293 for (x = 0; x < mb_count; x++) {
303 for (x = 0; x < mb_count; x++) {
308 if (score1 <= score2) {
322 int v1_shrunk = 0, v4_shrunk = 0;
323 for (x = 0; x < mb_count; x++) {
330 }
else if (
mb->best_encoding ==
ENC_V1) {
348 *training_set_v1_shrunk = v1_shrunk;
349 *training_set_v4_shrunk = v4_shrunk;
351 for (x = 0; x < mb_count; x++) {
357 if (score1 <= score2 && score1 <= score3) {
360 }
else if (score2 <= score3) {
384 int chunk_type_yuv,
int chunk_type_gray,
388 int incremental_codebook_replacement_mode = 0;
393 chunk_type_yuv + (incremental_codebook_replacement_mode ? 1 : 0) :
394 chunk_type_gray + (incremental_codebook_replacement_mode ? 1 : 0),
396 (incremental_codebook_replacement_mode ? (
size + 31) / 32 * 4 : 0));
403 if (incremental_codebook_replacement_mode) {
406 for (x = 0; x <
size; x++) {
413 for (y = 0; y < entry_size; y++)
414 buf[
ret++] =
codebook[y + x * entry_size] ^ (y >= 4 ? 0x80 : 0);
415 if ((
flags & 0xffffffff) == 0xffffffff) {
423 for (x = 0; x <
size; x++)
424 for (y = 0; y < entry_size; y++)
425 buf[
ret++] =
codebook[y + x * entry_size] ^ (y >= 4 ? 0x80 : 0);
432 uint8_t *
const in_data[4],
const int in_linesize[4],
433 uint8_t *out_data[4],
int out_linesize[4])
435 out_data[0] = in_data[0] + x + y * in_linesize[0];
436 out_linesize[0] = in_linesize[0];
439 out_data[1] = in_data[1] + (x >> 1) + (y >> 1) * in_linesize[1];
440 out_linesize[1] = in_linesize[1];
442 out_data[2] = in_data[2] + (x >> 1) + (y >> 1) * in_linesize[2];
443 out_linesize[2] = in_linesize[2];
455 data[0][ linesize[0]] =
456 data[0][1 + linesize[0]] =
info->v1_codebook[v1_vector * entry_size];
460 data[0][2 + linesize[0]] =
461 data[0][3 + linesize[0]] =
info->v1_codebook[v1_vector * entry_size + 1];
463 data[0][ 2 * linesize[0]] =
464 data[0][1 + 2 * linesize[0]] =
465 data[0][ 3 * linesize[0]] =
466 data[0][1 + 3 * linesize[0]] =
info->v1_codebook[v1_vector * entry_size + 2];
468 data[0][2 + 2 * linesize[0]] =
469 data[0][3 + 2 * linesize[0]] =
470 data[0][2 + 3 * linesize[0]] =
471 data[0][3 + 3 * linesize[0]] =
info->v1_codebook[v1_vector * entry_size + 3];
476 data[1][ linesize[1]] =
477 data[1][1 + linesize[1]] =
info->v1_codebook[v1_vector * entry_size + 4];
481 data[2][ linesize[2]] =
482 data[2][1 + linesize[2]] =
info->v1_codebook[v1_vector * entry_size + 5];
492 for (
i = y = 0; y < 4; y += 2) {
493 for (x = 0; x < 4; x += 2,
i++) {
494 data[0][x + y * linesize[0]] =
info->v4_codebook[v4_vector[
i] * entry_size];
495 data[0][x + 1 + y * linesize[0]] =
info->v4_codebook[v4_vector[
i] * entry_size + 1];
496 data[0][x + (y + 1) * linesize[0]] =
info->v4_codebook[v4_vector[
i] * entry_size + 2];
497 data[0][x + 1 + (y + 1) * linesize[0]] =
info->v4_codebook[v4_vector[
i] * entry_size + 3];
500 data[1][(x >> 1) + (y >> 1) * linesize[1]] =
info->v4_codebook[v4_vector[
i] * entry_size + 4];
501 data[2][(x >> 1) + (y >> 1) * linesize[2]] =
info->v4_codebook[v4_vector[
i] * entry_size + 5];
508 uint8_t *a_data[4],
int a_linesize[4],
509 uint8_t *b_data[4],
int b_linesize[4])
514 memcpy(a_data[0] + y * a_linesize[0], b_data[0] + y * b_linesize[0],
518 for (p = 1; p <= 2; p++)
519 for (y = 0; y <
MB_SIZE / 2; y++)
520 memcpy(a_data[p] + y * a_linesize[p],
521 b_data[p] + y * b_linesize[p],
527 uint8_t *scratch_data[4],
int scratch_linesize[4],
528 uint8_t *last_data[4],
int last_linesize[4],
531 int x, y, z,
bits, temp_size, header_ofs,
ret = 0, mb_count =
s->w *
h /
MB_AREA;
532 int needs_extra_bit, should_write_temp;
534 unsigned char temp[64];
536 uint8_t *sub_scratch_data[4] = { 0 }, *sub_last_data[4] = { 0 };
537 int sub_scratch_linesize[4] = { 0 }, sub_last_linesize[4] = { 0 };
543 if (
info->v4_size || !
s->skip_empty_cb)
546 if (
info->v1_size || !
s->skip_empty_cb)
550 for (z = y = 0; y <
h; y +=
MB_SIZE)
551 for (x = 0; x <
s->w; x +=
MB_SIZE, z++) {
555 sub_scratch_data, sub_scratch_linesize);
559 sub_last_data, sub_last_linesize);
560 copy_mb(
s, sub_scratch_data, sub_scratch_linesize,
561 sub_last_data, sub_last_linesize);
570 switch (
info->mode) {
574 for (x = 0; x < mb_count; x++)
575 buf[
ret++] =
s->mb[x].v1_vector;
583 for (x = 0; x < mb_count; x += 32) {
585 for (y = x; y <
FFMIN(x + 32, mb_count); y++)
586 if (
s->mb[y].best_encoding ==
ENC_V4)
587 flags |= 1
U << (31 - y + x);
592 for (y = x; y <
FFMIN(x + 32, mb_count); y++) {
596 buf[
ret++] =
mb->v1_vector;
598 for (z = 0; z < 4; z++)
599 buf[
ret++] =
mb->v4_vector[z];
612 for (x = 0; x < mb_count; x++) {
616 should_write_temp = 0;
630 if (
mb->best_encoding ==
ENC_SKIP || needs_extra_bit) {
631 memcpy(&buf[
ret],
temp, temp_size);
635 should_write_temp = 1;
638 if (needs_extra_bit) {
644 temp[temp_size++] =
mb->v1_vector;
645 else if (
mb->best_encoding ==
ENC_V4)
646 for (z = 0; z < 4; z++)
647 temp[temp_size++] =
mb->v4_vector[z];
649 if (should_write_temp) {
650 memcpy(&buf[
ret],
temp, temp_size);
659 memcpy(&buf[
ret],
temp, temp_size);
673 uint8_t *a_data[4],
int a_linesize[4],
674 uint8_t *b_data[4],
int b_linesize[4])
676 int x, y, p,
d,
ret = 0;
679 for (x = 0; x <
MB_SIZE; x++) {
680 d = a_data[0][x + y * a_linesize[0]] - b_data[0][x + y * b_linesize[0]];
685 for (p = 1; p <= 2; p++) {
686 for (y = 0; y <
MB_SIZE / 2; y++)
687 for (x = 0; x <
MB_SIZE / 2; x++) {
688 d = a_data[p][x + y * a_linesize[p]] - b_data[p][x + y * b_linesize[p]];
698 #define CERTAIN(x) ((x) != ENC_UNCERTAIN)
703 int x, y,
i, j, k, x2, y2, x3, y3, plane,
shift, mbn;
707 uint8_t vq_pict_buf[(
MB_AREA * 3) / 2];
708 uint8_t *sub_data[4], *vq_data[4];
709 int sub_linesize[4], vq_linesize[4];
712 for (mbn =
i = y = 0; y <
h; y +=
MB_SIZE) {
713 for (x = 0; x <
s->w; x +=
MB_SIZE, ++mbn) {
718 if (
s->mb[mbn].best_encoding != encoding)
722 base =
s->codebook_input +
i * entry_size;
725 for (j = y2 = 0; y2 < entry_size; y2 += 2)
726 for (x2 = 0; x2 < 4; x2 += 2, j++) {
727 plane = y2 < 4 ? 0 : 1 + (x2 >> 1);
728 shift = y2 < 4 ? 0 : 1;
732 data[plane][((x + x3) >>
shift) + 1 + ((y + y3) >>
shift) * linesize[plane]] +
733 data[plane][((x + x3) >>
shift) + (((y + y3) >>
shift) + 1) * linesize[plane]] +
734 data[plane][((x + x3) >>
shift) + 1 + (((y + y3) >>
shift) + 1) * linesize[plane]]) >> 2;
738 for (j = y2 = 0; y2 <
MB_SIZE; y2 += 2) {
739 for (x2 = 0; x2 <
MB_SIZE; x2 += 2)
740 for (k = 0; k < entry_size; k++, j++) {
741 plane = k >= 4 ? k - 3 : 0;
747 x3 = x + x2 + (k & 1);
748 y3 = y + y2 + (k >> 1);
751 base[j] =
data[plane][x3 + y3 * linesize[plane]];
765 size, 1,
s->codebook_closest, &
s->randctx, 0);
770 vq_data[0] = vq_pict_buf;
772 vq_data[1] = &vq_pict_buf[
MB_AREA];
773 vq_data[2] = vq_data[1] + (
MB_AREA >> 2);
779 for (x = 0; x <
s->w; x +=
MB_SIZE, j++) {
782 if (
CERTAIN(encoding) &&
mb->best_encoding != encoding)
789 mb->v1_vector =
s->codebook_closest[
i];
795 vq_data, vq_linesize);
797 for (k = 0; k < 4; k++)
798 mb->v4_vector[k] =
s->codebook_closest[
i + k];
804 vq_data, vq_linesize);
815 uint8_t *last_data[4],
int last_linesize[4],
816 uint8_t *
data[4],
int linesize[4],
820 uint8_t *sub_last_data [4], *sub_pict_data [4];
821 int sub_last_linesize[4], sub_pict_linesize[4];
824 for (x = 0; x <
s->w; x +=
MB_SIZE,
i++) {
826 sub_last_data, sub_last_linesize);
828 sub_pict_data, sub_pict_linesize);
830 s->mb[
i].skip_error =
832 sub_last_data, sub_last_linesize,
833 sub_pict_data, sub_pict_linesize);
844 buf[0] = keyframe ? 0x10 : 0x11;
848 unsigned char *buf,
int strip_size)
861 uint8_t *last_data[4],
int last_linesize[4],
862 uint8_t *
data[4],
int linesize[4],
863 uint8_t *scratch_data[4],
int scratch_linesize[4],
864 unsigned char *buf,
int64_t *best_score,
int *no_skip)
870 int v1enough, v1_size, v4enough, v4_size;
871 int new_v1_size, new_v4_size;
872 int v1shrunk, v4shrunk;
882 #define SMALLEST_CODEBOOK 1
884 for (v4enough = 0, v4_size = 0; v4_size <= v1_size && !v4enough; v4_size = v4_size ? v4_size << 2 : v1_size >= SMALLEST_CODEBOOK << 2 ? v1_size >> 2 :
SMALLEST_CODEBOOK) {
893 info.v1_size = v1_size;
898 info.v1_size = new_v1_size;
899 if (
info.v1_size < v1_size)
910 info.v4_size = v4_size;
915 info.v4_size = new_v4_size;
916 if (
info.v4_size < v4_size)
925 &v1shrunk, &v4shrunk);
928 int extra_iterations_limit =
s->max_extra_cb_iterations;
931 info.v1_size = v1_size;
935 if (new_v1_size <
info.v1_size)
936 info.v1_size = new_v1_size;
938 info.v4_size = v4_size;
942 if (new_v4_size <
info.v4_size)
943 info.v4_size = new_v4_size;
950 &v1shrunk, &v4shrunk);
952 if ((!v1shrunk && !v4shrunk) || !extra_iterations_limit--)
956 info.v1_size = v1_size;
960 if (new_v1_size <
info.v1_size)
961 info.v1_size = new_v1_size;
964 info.v4_size = v4_size;
968 if (new_v4_size <
info.v4_size)
969 info.v4_size = new_v4_size;
974 if (best_size == 0 || score < *best_score) {
977 scratch_data, scratch_linesize,
978 last_data, last_linesize, &
info,
991 memcpy(buf,
s->strip_buf, best_size);
997 int num_strips,
int data_size,
int isakeyframe)
999 buf[0] = isakeyframe ? 0 : 1;
1009 int isakeyframe,
unsigned char *buf,
int buf_size,
int *got_keyframe)
1011 int num_strips, strip,
i, y, nexty,
size, temp_size, best_size;
1012 uint8_t *last_data [4], *
data [4], *scratch_data [4];
1013 int last_linesize[4], linesize[4], scratch_linesize[4];
1014 int64_t best_score = 0, score, score_temp;
1015 int best_nstrips, best_strip_offsets[
MAX_STRIPS];
1020 for (y = 0; y <
s->h; y += 2)
1021 for (x = 0; x <
s->w; x += 2) {
1022 const uint8_t *ir[2];
1027 s->input_frame->data,
s->input_frame->linesize,
1028 scratch_data, scratch_linesize);
1030 for (
i = 0;
i < 4; ++
i) {
1034 rr = ir[i2][i1 * 3 + 0];
1035 gg = ir[i2][i1 * 3 + 1];
1036 bb = ir[i2][i1 * 3 + 2];
1043 rr = (2396625 * rr + 4793251 * gg + 1198732 * bb) >> 23;
1048 scratch_data[0][i1 + i2 * scratch_linesize[0]] = rr;
1054 rr = (-299683 *
r - 599156 *
g + 898839 *
b) >> 23;
1059 scratch_data[1][0] = rr + 128;
1062 rr = (748893 *
r - 599156 *
g - 149737 *
b) >> 23;
1067 scratch_data[2][0] = rr + 128;
1073 for (num_strips =
s->min_strips; num_strips <= s->max_strips && num_strips <= s->
h /
MB_SIZE; num_strips++) {
1075 int all_no_skip = 1;
1079 for (y = 0, strip = 1; y <
s->h; strip++, y = nexty) {
1080 int strip_height, no_skip;
1083 nexty = strip *
s->h / num_strips;
1086 nexty += 4 - (nexty & 3);
1088 strip_height = nexty - y;
1089 if (strip_height <= 0) {
1090 av_log(
s->avctx,
AV_LOG_INFO,
"skipping zero height strip %i of %i\n", strip, num_strips);
1096 s->input_frame->data,
s->input_frame->linesize,
1103 s->last_frame->data,
s->last_frame->linesize,
1104 last_data, last_linesize);
1106 s->scratch_frame->data,
s->scratch_frame->linesize,
1107 scratch_data, scratch_linesize);
1109 if ((temp_size =
rd_strip(
s, y, strip_height, isakeyframe,
1110 last_data, last_linesize,
data, linesize,
1111 scratch_data, scratch_linesize,
1112 s->frame_buf + strip_offsets[strip-1],
1113 &score_temp, &no_skip)) < 0)
1116 score += score_temp;
1118 all_no_skip &= no_skip;
1121 if (best_score == 0 || score < best_score) {
1126 memcpy(buf,
s->frame_buf, best_size);
1127 best_nstrips = num_strips;
1128 *got_keyframe = all_no_skip;
1129 memcpy(best_strip_offsets, strip_offsets,
sizeof(strip_offsets));
1133 if (num_strips - best_nstrips > 4)
1138 for (
i = 0;
i < best_nstrips;
i++) {
1145 if (!
s->strip_number_delta_range) {
1146 if (best_nstrips ==
s->max_strips) {
1147 s->max_strips = best_nstrips + 1;
1148 if (
s->max_strips >=
s->max_max_strips)
1149 s->max_strips =
s->max_max_strips;
1151 s->max_strips = best_nstrips;
1153 s->min_strips =
s->max_strips - 1;
1154 if (
s->min_strips <
s->min_min_strips)
1155 s->min_strips =
s->min_min_strips;
1157 s->max_strips = best_nstrips +
s->strip_number_delta_range;
1158 if (
s->max_strips >=
s->max_max_strips)
1159 s->max_strips =
s->max_max_strips;
1160 s->min_strips = best_nstrips -
s->strip_number_delta_range;
1161 if (
s->min_strips <
s->min_min_strips)
1162 s->min_strips =
s->min_min_strips;
1172 int ret, got_keyframe;
1218 .
p.
name =
"cinepak",