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);