The encoder produces bitstream compatible with the current specification and version 2 is set as reserved (non-standardizable).tags/n3.3
@@ -380,7 +380,7 @@ static void write_quant_tables(RangeCoder *c, | |||||
static void write_header(FFV1Context *f) | static void write_header(FFV1Context *f) | ||||
{ | { | ||||
uint8_t state[CONTEXT_SIZE]; | uint8_t state[CONTEXT_SIZE]; | ||||
int i, j; | |||||
int i; | |||||
RangeCoder *const c = &f->slice_context[0]->c; | RangeCoder *const c = &f->slice_context[0]->c; | ||||
memset(state, 128, sizeof(state)); | memset(state, 128, sizeof(state)); | ||||
@@ -402,25 +402,6 @@ static void write_header(FFV1Context *f) | |||||
put_rac(c, state, f->transparency); | put_rac(c, state, f->transparency); | ||||
write_quant_tables(c, f->quant_table); | write_quant_tables(c, f->quant_table); | ||||
} else if (f->version < 3) { | |||||
put_symbol(c, state, f->slice_count, 0); | |||||
for (i = 0; i < f->slice_count; i++) { | |||||
FFV1Context *fs = f->slice_context[i]; | |||||
put_symbol(c, state, | |||||
(fs->slice_x + 1) * f->num_h_slices / f->width, 0); | |||||
put_symbol(c, state, | |||||
(fs->slice_y + 1) * f->num_v_slices / f->height, 0); | |||||
put_symbol(c, state, | |||||
(fs->slice_width + 1) * f->num_h_slices / f->width - 1, | |||||
0); | |||||
put_symbol(c, state, | |||||
(fs->slice_height + 1) * f->num_v_slices / f->height - 1, | |||||
0); | |||||
for (j = 0; j < f->plane_count; j++) { | |||||
put_symbol(c, state, f->plane[j].quant_table_index, 0); | |||||
av_assert0(f->plane[j].quant_table_index == f->context_model); | |||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -442,7 +423,7 @@ static int write_extradata(FFV1Context *f) | |||||
ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8); | ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8); | ||||
put_symbol(c, state, f->version, 0); | put_symbol(c, state, f->version, 0); | ||||
if (f->version > 2) { | |||||
if (f->version > 1) { | |||||
if (f->version == 3) | if (f->version == 3) | ||||
f->minor_version = 2; | f->minor_version = 2; | ||||
put_symbol(c, state, f->minor_version, 0); | put_symbol(c, state, f->minor_version, 0); | ||||
@@ -566,27 +547,44 @@ static av_cold int ffv1_encode_init(AVCodecContext *avctx) | |||||
s->version = 0; | s->version = 0; | ||||
if ((avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) || | |||||
avctx->slices > 1) | |||||
s->version = FFMAX(s->version, 2); | |||||
if (avctx->level == 3) { | |||||
s->version = 3; | |||||
switch (avctx->level) { | |||||
case 3: | |||||
break; | |||||
case 2: | |||||
av_log(avctx, AV_LOG_ERROR, | |||||
"Version 2 had been deemed non-standard and deprecated " | |||||
"the support for it had been removed\n"); | |||||
return AVERROR(ENOSYS); | |||||
case 1: | |||||
case 0: | |||||
if (avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) { | |||||
av_log(avctx, AV_LOG_ERROR, | |||||
"Multiple pass encoding requires version 3.\n"); | |||||
return AVERROR(ENOSYS); | |||||
} | |||||
if (avctx->slices > 1) { | |||||
av_log(avctx, AV_LOG_ERROR, | |||||
"Multiple slices support requires version 3.\n"); | |||||
return AVERROR(ENOSYS); | |||||
} | |||||
break; | |||||
case FF_LEVEL_UNKNOWN: | |||||
if ((avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) || | |||||
avctx->slices > 1) | |||||
s->version = 3; | |||||
else | |||||
s->version = 0; | |||||
break; | |||||
default: | |||||
av_log(avctx, AV_LOG_ERROR, "Version %d not supported\n", | |||||
avctx->level); | |||||
return AVERROR(ENOSYS); | |||||
} | } | ||||
if (s->ec < 0) { | if (s->ec < 0) { | ||||
s->ec = (s->version >= 3); | s->ec = (s->version >= 3); | ||||
} | } | ||||
if (s->version >= 2 && | |||||
avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) { | |||||
av_log(avctx, AV_LOG_ERROR, | |||||
"Version %d requested, please set -strict experimental in " | |||||
"order to enable it\n", | |||||
s->version); | |||||
return AVERROR(ENOSYS); | |||||
} | |||||
#if FF_API_CODER_TYPE | #if FF_API_CODER_TYPE | ||||
FF_DISABLE_DEPRECATION_WARNINGS | FF_DISABLE_DEPRECATION_WARNINGS | ||||
if (avctx->coder_type != -1) | if (avctx->coder_type != -1) | ||||
@@ -754,7 +752,7 @@ FF_ENABLE_DEPRECATION_WARNINGS | |||||
int gob_count = 0; | int gob_count = 0; | ||||
char *next; | char *next; | ||||
av_assert0(s->version >= 2); | |||||
av_assert0(s->version > 2); | |||||
for (;; ) { | for (;; ) { | ||||
for (j = 0; j < 256; j++) | for (j = 0; j < 256; j++) | ||||
@@ -1,46 +1,46 @@ | |||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5688 size: 71768 | |||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5690 size: 71796 | |||||
ret: 0 st:-1 flags:0 ts:-1.000000 | ret: 0 st:-1 flags:0 ts:-1.000000 | ||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5688 size: 71768 | |||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5690 size: 71796 | |||||
ret: 0 st:-1 flags:1 ts: 1.894167 | ret: 0 st:-1 flags:1 ts: 1.894167 | ||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2589296 size: 81788 | |||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2590398 size: 81816 | |||||
ret: 0 st: 0 flags:0 ts: 0.800000 | ret: 0 st: 0 flags:0 ts: 0.800000 | ||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:1666112 size: 77204 | |||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:1666848 size: 77232 | |||||
ret:-1 st: 0 flags:1 ts:-0.320000 | ret:-1 st: 0 flags:1 ts:-0.320000 | ||||
ret:-1 st:-1 flags:0 ts: 2.576668 | ret:-1 st:-1 flags:0 ts: 2.576668 | ||||
ret: 0 st:-1 flags:1 ts: 1.470835 | ret: 0 st:-1 flags:1 ts: 1.470835 | ||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2589296 size: 81788 | |||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2590398 size: 81816 | |||||
ret: 0 st: 0 flags:0 ts: 0.360000 | ret: 0 st: 0 flags:0 ts: 0.360000 | ||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 808352 size: 70696 | |||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 808720 size: 70724 | |||||
ret:-1 st: 0 flags:1 ts:-0.760000 | ret:-1 st: 0 flags:1 ts:-0.760000 | ||||
ret:-1 st:-1 flags:0 ts: 2.153336 | ret:-1 st:-1 flags:0 ts: 2.153336 | ||||
ret: 0 st:-1 flags:1 ts: 1.047503 | ret: 0 st:-1 flags:1 ts: 1.047503 | ||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:1666112 size: 77204 | |||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:1666848 size: 77232 | |||||
ret: 0 st: 0 flags:0 ts:-0.040000 | ret: 0 st: 0 flags:0 ts:-0.040000 | ||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5688 size: 71768 | |||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5690 size: 71796 | |||||
ret: 0 st: 0 flags:1 ts: 2.840000 | ret: 0 st: 0 flags:1 ts: 2.840000 | ||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3550788 size: 83738 | |||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3552258 size: 83766 | |||||
ret: 0 st:-1 flags:0 ts: 1.730004 | ret: 0 st:-1 flags:0 ts: 1.730004 | ||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3550788 size: 83738 | |||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3552258 size: 83766 | |||||
ret: 0 st:-1 flags:1 ts: 0.624171 | ret: 0 st:-1 flags:1 ts: 0.624171 | ||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 808352 size: 70696 | |||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 808720 size: 70724 | |||||
ret: 0 st: 0 flags:0 ts:-0.480000 | ret: 0 st: 0 flags:0 ts:-0.480000 | ||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5688 size: 71768 | |||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5690 size: 71796 | |||||
ret: 0 st: 0 flags:1 ts: 2.400000 | ret: 0 st: 0 flags:1 ts: 2.400000 | ||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3550788 size: 83738 | |||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3552258 size: 83766 | |||||
ret: 0 st:-1 flags:0 ts: 1.306672 | ret: 0 st:-1 flags:0 ts: 1.306672 | ||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2589296 size: 81788 | |||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2590398 size: 81816 | |||||
ret: 0 st:-1 flags:1 ts: 0.200839 | ret: 0 st:-1 flags:1 ts: 0.200839 | ||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5688 size: 71768 | |||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5690 size: 71796 | |||||
ret: 0 st: 0 flags:0 ts:-0.920000 | ret: 0 st: 0 flags:0 ts:-0.920000 | ||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5688 size: 71768 | |||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 5690 size: 71796 | |||||
ret: 0 st: 0 flags:1 ts: 2.000000 | ret: 0 st: 0 flags:1 ts: 2.000000 | ||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3550788 size: 83738 | |||||
ret: 0 st: 0 flags:1 dts: 1.920000 pts: 1.920000 pos:3552258 size: 83766 | |||||
ret: 0 st:-1 flags:0 ts: 0.883340 | ret: 0 st:-1 flags:0 ts: 0.883340 | ||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:1666112 size: 77204 | |||||
ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:1666848 size: 77232 | |||||
ret:-1 st:-1 flags:1 ts:-0.222493 | ret:-1 st:-1 flags:1 ts:-0.222493 | ||||
ret:-1 st: 0 flags:0 ts: 2.680000 | ret:-1 st: 0 flags:0 ts: 2.680000 | ||||
ret: 0 st: 0 flags:1 ts: 1.560000 | ret: 0 st: 0 flags:1 ts: 1.560000 | ||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2589296 size: 81788 | |||||
ret: 0 st: 0 flags:1 dts: 1.440000 pts: 1.440000 pos:2590398 size: 81816 | |||||
ret: 0 st:-1 flags:0 ts: 0.460008 | ret: 0 st:-1 flags:0 ts: 0.460008 | ||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 808352 size: 70696 | |||||
ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 808720 size: 70724 | |||||
ret:-1 st:-1 flags:1 ts:-0.645825 | ret:-1 st:-1 flags:1 ts:-0.645825 |
@@ -1,4 +1,4 @@ | |||||
d236e8441d7e04e24d882bb97faccd36 *tests/data/fate/vsynth1-ffv1.avi | |||||
2689718 tests/data/fate/vsynth1-ffv1.avi | |||||
a6703280a623fe42de7f7a53c2383073 *tests/data/fate/vsynth1-ffv1.avi | |||||
2691264 tests/data/fate/vsynth1-ffv1.avi | |||||
c5ccac874dbf808e9088bc3107860042 *tests/data/fate/vsynth1-ffv1.out.rawvideo | c5ccac874dbf808e9088bc3107860042 *tests/data/fate/vsynth1-ffv1.out.rawvideo | ||||
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200 |
@@ -1,4 +1,4 @@ | |||||
4af788aeb692573717fe205f3ba20a33 *tests/data/fate/vsynth2-ffv1.avi | |||||
3716494 tests/data/fate/vsynth2-ffv1.avi | |||||
2acd1edd97eb98895bae47770b700f89 *tests/data/fate/vsynth2-ffv1.avi | |||||
3718022 tests/data/fate/vsynth2-ffv1.avi | |||||
36d7ca943916e1743cefa609eba0205c *tests/data/fate/vsynth2-ffv1.out.rawvideo | 36d7ca943916e1743cefa609eba0205c *tests/data/fate/vsynth2-ffv1.out.rawvideo | ||||
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200 | stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 7603200/ 7603200 |