|
|
|
@@ -1068,6 +1068,51 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
int64_t maxsize = FF_MIN_BUFFER_SIZE |
|
|
|
+ avctx->width*avctx->height*35LL*4; |
|
|
|
|
|
|
|
if(!pict) { |
|
|
|
if (avctx->flags & CODEC_FLAG_PASS1) { |
|
|
|
int j, k, m; |
|
|
|
char *p = avctx->stats_out; |
|
|
|
char *end = p + STATS_OUT_SIZE; |
|
|
|
|
|
|
|
memset(f->rc_stat, 0, sizeof(f->rc_stat)); |
|
|
|
for (i = 0; i < f->quant_table_count; i++) |
|
|
|
memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i])); |
|
|
|
|
|
|
|
for (j = 0; j < f->slice_count; j++) { |
|
|
|
FFV1Context *fs = f->slice_context[j]; |
|
|
|
for (i = 0; i < 256; i++) { |
|
|
|
f->rc_stat[i][0] += fs->rc_stat[i][0]; |
|
|
|
f->rc_stat[i][1] += fs->rc_stat[i][1]; |
|
|
|
} |
|
|
|
for (i = 0; i < f->quant_table_count; i++) { |
|
|
|
for (k = 0; k < f->context_count[i]; k++) |
|
|
|
for (m = 0; m < 32; m++) { |
|
|
|
f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0]; |
|
|
|
f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (j = 0; j < 256; j++) { |
|
|
|
snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ", |
|
|
|
f->rc_stat[j][0], f->rc_stat[j][1]); |
|
|
|
p += strlen(p); |
|
|
|
} |
|
|
|
snprintf(p, end - p, "\n"); |
|
|
|
|
|
|
|
for (i = 0; i < f->quant_table_count; i++) { |
|
|
|
for (j = 0; j < f->context_count[i]; j++) |
|
|
|
for (m = 0; m < 32; m++) { |
|
|
|
snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ", |
|
|
|
f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]); |
|
|
|
p += strlen(p); |
|
|
|
} |
|
|
|
} |
|
|
|
snprintf(p, end - p, "%d\n", f->gob_count); |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (f->version > 3) |
|
|
|
maxsize = FF_MIN_BUFFER_SIZE + avctx->width*avctx->height*3LL*4; |
|
|
|
|
|
|
|
@@ -1139,47 +1184,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
buf_p += bytes; |
|
|
|
} |
|
|
|
|
|
|
|
if ((avctx->flags & CODEC_FLAG_PASS1) && (f->picture_number & 31) == 0) { |
|
|
|
int j, k, m; |
|
|
|
char *p = avctx->stats_out; |
|
|
|
char *end = p + STATS_OUT_SIZE; |
|
|
|
|
|
|
|
memset(f->rc_stat, 0, sizeof(f->rc_stat)); |
|
|
|
for (i = 0; i < f->quant_table_count; i++) |
|
|
|
memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i])); |
|
|
|
|
|
|
|
for (j = 0; j < f->slice_count; j++) { |
|
|
|
FFV1Context *fs = f->slice_context[j]; |
|
|
|
for (i = 0; i < 256; i++) { |
|
|
|
f->rc_stat[i][0] += fs->rc_stat[i][0]; |
|
|
|
f->rc_stat[i][1] += fs->rc_stat[i][1]; |
|
|
|
} |
|
|
|
for (i = 0; i < f->quant_table_count; i++) { |
|
|
|
for (k = 0; k < f->context_count[i]; k++) |
|
|
|
for (m = 0; m < 32; m++) { |
|
|
|
f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0]; |
|
|
|
f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (j = 0; j < 256; j++) { |
|
|
|
snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ", |
|
|
|
f->rc_stat[j][0], f->rc_stat[j][1]); |
|
|
|
p += strlen(p); |
|
|
|
} |
|
|
|
snprintf(p, end - p, "\n"); |
|
|
|
|
|
|
|
for (i = 0; i < f->quant_table_count; i++) { |
|
|
|
for (j = 0; j < f->context_count[i]; j++) |
|
|
|
for (m = 0; m < 32; m++) { |
|
|
|
snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ", |
|
|
|
f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]); |
|
|
|
p += strlen(p); |
|
|
|
} |
|
|
|
} |
|
|
|
snprintf(p, end - p, "%d\n", f->gob_count); |
|
|
|
} else if (avctx->flags & CODEC_FLAG_PASS1) |
|
|
|
if (avctx->flags & CODEC_FLAG_PASS1) |
|
|
|
avctx->stats_out[0] = '\0'; |
|
|
|
|
|
|
|
f->picture_number++; |
|
|
|
@@ -1220,7 +1225,7 @@ AVCodec ff_ffv1_encoder = { |
|
|
|
.init = encode_init, |
|
|
|
.encode2 = encode_frame, |
|
|
|
.close = ffv1_close, |
|
|
|
.capabilities = CODEC_CAP_SLICE_THREADS, |
|
|
|
.capabilities = CODEC_CAP_SLICE_THREADS | CODEC_CAP_DELAY, |
|
|
|
.pix_fmts = (const enum AVPixelFormat[]) { |
|
|
|
AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV444P, |
|
|
|
AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV411P, |
|
|
|
|