82 #define CVID_HEADER_SIZE 10
83 #define STRIP_HEADER_SIZE 12
84 #define CHUNK_HEADER_SIZE 4
86 #define MB_SIZE 4 //4x4 MBs
87 #define MB_AREA (MB_SIZE*MB_SIZE)
89 #define VECTOR_MAX 6 //six or four entries per vector depending on format
90 #define CODEBOOK_MAX 256 //size of a codebook
92 #define MAX_STRIPS 32 //Note: having fewer choices regarding the number of strips speeds up encoding (obviously)
93 #define MIN_STRIPS 1 //Note: having more strips speeds up encoding the frame (this is less obvious)
155 #ifdef CINEPAKENC_DEBUG
157 int num_v1_mode, num_v4_mode, num_mc_mode;
158 int num_v1_encs, num_v4_encs, num_skips;
168 #define OFFSET(x) offsetof(CinepakEncContext, x)
169 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
171 {
"max_extra_cb_iterations",
"Max extra codebook recalculation passes, more is better and slower",
OFFSET(max_extra_cb_iterations),
AV_OPT_TYPE_INT, { .i64 = 2 }, 0, INT_MAX,
VE },
172 {
"skip_empty_cb",
"Avoid wasting bytes, ignore vintage MacOS decoder",
OFFSET(skip_empty_cb),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1,
VE },
173 {
"max_strips",
"Limit strips/frame, vintage compatible is 1..3, otherwise the more the better",
OFFSET(max_max_strips),
AV_OPT_TYPE_INT, { .i64 = 3 },
MIN_STRIPS,
MAX_STRIPS,
VE },
174 {
"min_strips",
"Enforce min strips/frame, more is worse and faster, must be <= max_strips",
OFFSET(min_min_strips),
AV_OPT_TYPE_INT, { .i64 =
MIN_STRIPS },
MIN_STRIPS,
MAX_STRIPS,
VE },
175 {
"strip_number_adaptivity",
"How fast the strip number adapts, more is slightly better, much slower",
OFFSET(strip_number_delta_range),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0,
MAX_STRIPS-
MIN_STRIPS,
VE },
189 int x, mb_count, strip_buf_size, frame_buf_size;
192 av_log(avctx,
AV_LOG_ERROR,
"width and height must be multiples of four (got %ix%i)\n",
198 av_log(avctx,
AV_LOG_ERROR,
"minimal number of strips can not exceed maximal (got %i and %i)\n",
242 #ifdef CINEPAKENC_DEBUG
287 #ifdef CINEPAKENC_DEBUG
288 s->num_v1_mode = s->num_v4_mode = s->num_mc_mode = s->num_v1_encs = s->num_v4_encs = s->num_skips = 0;
304 #ifdef CINEPAKENC_DEBUG
315 #ifdef CINEPAK_REPORT_SERR
325 int64_t score1, score2, score3;
332 #ifdef CINEPAK_REPORT_SERR
339 ret += s->
lambda * 8 * mb_count;
342 for(x = 0; x < mb_count; x++) {
345 #ifdef CINEPAK_REPORT_SERR
358 *training_set_v1_shrunk = *training_set_v4_shrunk = 0;
359 for(x = 0; x < mb_count; x++) {
367 #ifdef CINEPAK_REPORT_SERR
372 for(x = 0; x < mb_count; x++) {
377 if(score1 <= score2) {
379 #ifdef CINEPAK_REPORT_SERR
385 #ifdef CINEPAK_REPORT_SERR
397 int v1_shrunk = 0, v4_shrunk = 0;
398 for(x = 0; x < mb_count; x++) {
405 #ifdef CINEPAK_REPORT_SERR
413 #ifdef CINEPAK_REPORT_SERR
418 #ifdef CINEPAK_REPORT_SERR
427 #ifdef CINEPAK_REPORT_SERR
432 #ifdef CINEPAK_REPORT_SERR
438 *training_set_v1_shrunk = v1_shrunk;
439 *training_set_v4_shrunk = v4_shrunk;
441 for(x = 0; x < mb_count; x++) {
447 if(score1 <= score2 && score1 <= score3) {
449 #ifdef CINEPAK_REPORT_SERR
453 }
else if(score2 <= score3) {
455 #ifdef CINEPAK_REPORT_SERR
461 #ifdef CINEPAK_REPORT_SERR
485 int incremental_codebook_replacement_mode = 0;
490 chunk_type_yuv+(incremental_codebook_replacement_mode?1:0) :
491 chunk_type_gray+(incremental_codebook_replacement_mode?1:0),
493 + (incremental_codebook_replacement_mode?(size+31)/32*4:0) );
500 if(incremental_codebook_replacement_mode) {
503 for(x = 0; x <
size; x++) {
509 flags = ((flags>>1) | 0x80000000);
510 for(y = 0; y < entry_size; y++)
511 buf[ret++] = codebook[y + x*entry_size] ^ (y >= 4 ? 0x80 : 0);
512 if((flags&0xffffffff) == 0xffffffff) {
513 AV_WB32(&buf[flagsind], flags);
518 AV_WB32(&buf[flagsind], flags);
520 for(x = 0; x <
size; x++)
521 for(y = 0; y < entry_size; y++)
522 buf[ret++] = codebook[y + x*entry_size] ^ (y >= 4 ? 0x80 : 0);
547 sub_pict->
data[0][0] =
548 sub_pict->
data[0][1] =
552 sub_pict->
data[0][2] =
553 sub_pict->
data[0][3] =
568 sub_pict->
data[1][0] =
569 sub_pict->
data[1][1] =
573 sub_pict->
data[2][0] =
574 sub_pict->
data[2][1] =
585 for(i = y = 0; y < 4; y += 2) {
586 for(x = 0; x < 4; x += 2, i++) {
610 for(p = 1; p <= 2; p++) {
611 for(y = 0; y < MB_SIZE/2; y++) {
623 int needs_extra_bit, should_write_temp;
624 unsigned char temp[64];
626 AVPicture sub_scratch = {{0}}, sub_last = {{0}};
639 for(z = y = 0; y < h; y +=
MB_SIZE) {
640 for(x = 0; x < s->
w; x +=
MB_SIZE, z++) {
647 copy_mb(s, &sub_scratch, &sub_last);
660 for(x = 0; x < mb_count; x++)
669 for(x = 0; x < mb_count; x += 32) {
671 for(y = x; y <
FFMIN(x+32, mb_count); y++)
673 flags |= 1 << (31 - y + x);
678 for(y = x; y <
FFMIN(x+32, mb_count); y++) {
684 for(z = 0; z < 4; z++)
696 flags = bits = temp_size = 0;
698 for(x = 0; x < mb_count; x++) {
702 should_write_temp = 0;
717 memcpy(&buf[ret], temp, temp_size);
721 should_write_temp = 1;
724 if(needs_extra_bit) {
732 for(z = 0; z < 4; z++)
735 if(should_write_temp) {
736 memcpy(&buf[ret], temp, temp_size);
745 memcpy(&buf[ret], temp, temp_size);
760 int x,
y, p, d,
ret = 0;
770 for(p = 1; p <= 2; p++) {
771 for(y = 0; y < MB_SIZE/2; y++) {
772 for(x = 0; x < MB_SIZE/2; x++) {
784 #define CERTAIN(x) ((x)!=ENC_UNCERTAIN)
789 int x,
y, i, j, k, x2, y2, x3, y3, plane,
shift, mbn;
793 int64_t total_error = 0;
797 for(mbn = i = y = 0; y < h; y +=
MB_SIZE) {
798 for(x = 0; x < s->
w; x +=
MB_SIZE, ++mbn) {
809 for(j = y2 = 0; y2 < entry_size; y2 += 2) {
810 for(x2 = 0; x2 < 4; x2 += 2, j++) {
811 plane = y2 < 4 ? 0 : 1 + (x2 >> 1);
812 shift = y2 < 4 ? 0 : 1;
815 base[j] = (pict->
data[plane][((x+x3) >> shift) + ((y+y3) >> shift) * pict->
linesize[plane]] +
816 pict->
data[plane][((x+x3) >> shift) + 1 + ((y+y3) >> shift) * pict->
linesize[plane]] +
817 pict->
data[plane][((x+x3) >> shift) + (((y+y3) >> shift) + 1) * pict->
linesize[plane]] +
823 for(j = y2 = 0; y2 <
MB_SIZE; y2 += 2) {
824 for(x2 = 0; x2 <
MB_SIZE; x2 += 2) {
825 for(k = 0; k < entry_size; k++, j++) {
826 plane = k >= 4 ? k - 3 : 0;
832 x3 = x + x2 + (k & 1);
833 y3 = y + y2 + (k >> 1);
836 base[j] = pict->
data[plane][x3 + y3*pict->
linesize[plane]];
859 vq_pict.data[0] = vq_pict_buf;
861 vq_pict.data[1] = &vq_pict_buf[
MB_AREA];
862 vq_pict.data[2] = vq_pict.data[1] + (
MB_AREA >> 2);
863 vq_pict.linesize[1] = vq_pict.linesize[2] =
MB_SIZE >> 1;
866 for(i = j = y = 0; y < h; y +=
MB_SIZE) {
867 for(x = 0; x < s->
w; x +=
MB_SIZE, j++) {
885 for(k = 0; k < 4; k++)
910 for(i = y = 0; y < h; y +=
MB_SIZE) {
911 for(x = 0; x < s->
w; x +=
MB_SIZE, i++) {
927 buf[0] = keyframe ? 0x10: 0x11;
939 #ifdef CINEPAK_REPORT_SERR
945 #ifdef CINEPAK_REPORT_SERR
951 int v1enough, v1_size, v4enough, v4_size;
952 int new_v1_size, new_v4_size;
953 int v1shrunk, v4shrunk;
962 #define SMALLEST_CODEBOOK 1
964 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) {
998 #ifdef CINEPAK_REPORT_SERR
1009 if(new_v1_size < info.
v1_size){
1016 if(new_v4_size < info.
v4_size) {
1026 &v1shrunk, &v4shrunk
1027 #ifdef CINEPAK_REPORT_SERR
1032 if((!v1shrunk && !v4shrunk) || !extra_iterations_limit--)
break;
1037 if(new_v1_size < info.
v1_size){
1045 if(new_v4_size < info.
v4_size) {
1055 if(best_size == 0 || score < *best_score) {
1057 *best_score = score;
1058 #ifdef CINEPAK_REPORT_SERR
1065 #ifdef CINEPAK_REPORT_SERR
1069 #ifdef CINEPAKENC_DEBUG
1071 memcpy(s->best_mb, s->
mb, mb_count*
sizeof(
mb_info));
1082 #ifdef CINEPAKENC_DEBUG
1094 for(x = 0; x < s->
w*h/
MB_AREA; x++)
1095 if(s->best_mb[x].best_encoding ==
ENC_V1)
1097 else if(s->best_mb[x].best_encoding ==
ENC_V4)
1112 buf[0] = isakeyframe ? 0 : 1;
1123 int num_strips, strip, i,
y, nexty,
size, temp_size;
1124 AVPicture last_pict, pict, scratch_pict;
1125 int64_t best_score = 0, score, score_temp;
1126 #ifdef CINEPAK_REPORT_SERR
1127 int64_t best_serr = 0, serr, serr_temp;
1130 int best_nstrips = -1, best_size = -1;
1135 for(y = 0; y < s->
h; y += 2) {
1136 for(x = 0; x < s->
w; x += 2) {
1139 ir[1] = ir[0] + ((
AVPicture*)frame)->linesize[0];
1142 for(i=0; i<4; ++i) {
1144 i1 = (i&1); i2 = (i>=2);
1145 rr = ir[i2][i1*3+0];
1146 gg = ir[i2][i1*3+1];
1147 bb = ir[i2][i1*3+2];
1148 r += rr; g += gg; b += bb;
1152 rr = (2396625*rr + 4793251*gg + 1198732*bb) >> 23;
1154 else if (rr > 255) rr = 255;
1155 scratch_pict.
data[0][i1 + i2*scratch_pict.
linesize[0]] = rr;
1161 rr = (-299683*r - 599156*g + 898839*
b) >> 23;
1162 if( rr < -128) rr = -128;
1163 else if (rr > 127) rr = 127;
1164 scratch_pict.
data[1][0] = rr + 128;
1167 rr = (748893*r - 599156*g - 149737*
b) >> 23;
1168 if( rr < -128) rr = -128;
1169 else if (rr > 127) rr = 127;
1170 scratch_pict.
data[2][0] = rr + 128;
1177 for(num_strips = s->
min_strips; num_strips <= s->max_strips && num_strips <= s->h /
MB_SIZE; num_strips++) {
1180 #ifdef CINEPAK_REPORT_SERR
1184 for(y = 0, strip = 1; y < s->
h; strip++, y = nexty) {
1187 nexty = strip * s->
h / num_strips;
1190 nexty += 4 - (nexty & 3);
1192 strip_height = nexty -
y;
1193 if(strip_height <= 0) {
1206 #ifdef CINEPAK_REPORT_SERR
1212 score += score_temp;
1213 #ifdef CINEPAK_REPORT_SERR
1221 if(best_score == 0 || score < best_score) {
1223 #ifdef CINEPAK_REPORT_SERR
1228 #ifdef CINEPAK_REPORT_SERR
1229 av_log(s->
avctx,
AV_LOG_INFO,
"best number of strips so far: %2i, %12lli, %i B\n", num_strips, (
long long int)serr, best_size);
1234 best_nstrips = num_strips;
1238 if(num_strips - best_nstrips > 4)
1242 av_assert0(best_nstrips >= 0 && best_size >= 0);
1309 #ifdef CINEPAKENC_DEBUG
1316 #ifdef CINEPAKENC_DEBUG
1317 av_log(avctx,
AV_LOG_INFO,
"strip coding stats: %i V1 mode, %i V4 mode, %i MC mode (%i V1 encs, %i V4 encs, %i skips)\n",
1318 s->num_v1_mode, s->num_v4_mode, s->num_mc_mode, s->num_v1_encs, s->num_v4_encs, s->num_skips);