mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-28 12:32:17 +02:00
Merge commit '4bb1070c154e49d35805fbcdac9c9e92f702ef96'
* commit '4bb1070c154e49d35805fbcdac9c9e92f702ef96': ffv1: Explicitly name the coder type Conflicts: libavcodec/ffv1.h libavcodec/ffv1dec.c libavcodec/ffv1enc.c Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
This commit is contained in:
commit
bba2488f07
@ -73,7 +73,7 @@ av_cold int ff_ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
|
|||||||
for (j = 0; j < f->plane_count; j++) {
|
for (j = 0; j < f->plane_count; j++) {
|
||||||
PlaneContext *const p = &fs->plane[j];
|
PlaneContext *const p = &fs->plane[j];
|
||||||
|
|
||||||
if (fs->ac) {
|
if (fs->ac != AC_GOLOMB_RICE) {
|
||||||
if (!p->state)
|
if (!p->state)
|
||||||
p->state = av_malloc_array(p->context_count, CONTEXT_SIZE *
|
p->state = av_malloc_array(p->context_count, CONTEXT_SIZE *
|
||||||
sizeof(uint8_t));
|
sizeof(uint8_t));
|
||||||
@ -92,7 +92,7 @@ av_cold int ff_ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fs->ac > 1) {
|
if (fs->ac == AC_RANGE_CUSTOM_TAB) {
|
||||||
//FIXME only redo if state_transition changed
|
//FIXME only redo if state_transition changed
|
||||||
for (j = 1; j < 256; j++) {
|
for (j = 1; j < 256; j++) {
|
||||||
fs->c. one_state[ j] = f->state_transition[j];
|
fs->c. one_state[ j] = f->state_transition[j];
|
||||||
@ -184,7 +184,7 @@ void ff_ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
|
|||||||
p->interlace_bit_state[0] = 128;
|
p->interlace_bit_state[0] = 128;
|
||||||
p->interlace_bit_state[1] = 128;
|
p->interlace_bit_state[1] = 128;
|
||||||
|
|
||||||
if (fs->ac) {
|
if (fs->ac != AC_GOLOMB_RICE) {
|
||||||
if (f->initial_states[p->quant_table_index]) {
|
if (f->initial_states[p->quant_table_index]) {
|
||||||
memcpy(p->state, f->initial_states[p->quant_table_index],
|
memcpy(p->state, f->initial_states[p->quant_table_index],
|
||||||
CONTEXT_SIZE * p->context_count);
|
CONTEXT_SIZE * p->context_count);
|
||||||
|
@ -53,6 +53,10 @@
|
|||||||
#define MAX_QUANT_TABLES 8
|
#define MAX_QUANT_TABLES 8
|
||||||
#define MAX_CONTEXT_INPUTS 5
|
#define MAX_CONTEXT_INPUTS 5
|
||||||
|
|
||||||
|
#define AC_GOLOMB_RICE 0
|
||||||
|
#define AC_RANGE_DEFAULT_TAB 1
|
||||||
|
#define AC_RANGE_CUSTOM_TAB 2
|
||||||
|
|
||||||
typedef struct VlcState {
|
typedef struct VlcState {
|
||||||
int16_t drift;
|
int16_t drift;
|
||||||
uint16_t error_sum;
|
uint16_t error_sum;
|
||||||
|
@ -133,7 +133,7 @@ static av_always_inline void decode_line(FFV1Context *s, int w,
|
|||||||
|
|
||||||
av_assert2(context < p->context_count);
|
av_assert2(context < p->context_count);
|
||||||
|
|
||||||
if (s->ac) {
|
if (s->ac != AC_GOLOMB_RICE) {
|
||||||
diff = get_symbol_inline(c, p->state[context], 1);
|
diff = get_symbol_inline(c, p->state[context], 1);
|
||||||
} else {
|
} else {
|
||||||
if (context == 0 && run_mode == 0)
|
if (context == 0 && run_mode == 0)
|
||||||
@ -423,7 +423,7 @@ static int decode_slice(AVCodecContext *c, void *arg)
|
|||||||
x = fs->slice_x;
|
x = fs->slice_x;
|
||||||
y = fs->slice_y;
|
y = fs->slice_y;
|
||||||
|
|
||||||
if (!fs->ac) {
|
if (fs->ac == AC_GOLOMB_RICE) {
|
||||||
if (f->version == 3 && f->micro_version > 1 || f->version > 3)
|
if (f->version == 3 && f->micro_version > 1 || f->version > 3)
|
||||||
get_rac(&fs->c, (uint8_t[]) { 129 });
|
get_rac(&fs->c, (uint8_t[]) { 129 });
|
||||||
fs->ac_byte_count = f->version > 2 || (!x && !y) ? fs->c.bytestream - fs->c.bytestream_start - 1 : 0;
|
fs->ac_byte_count = f->version > 2 || (!x && !y) ? fs->c.bytestream - fs->c.bytestream_start - 1 : 0;
|
||||||
@ -452,7 +452,7 @@ static int decode_slice(AVCodecContext *c, void *arg)
|
|||||||
p->data[2] + ps * x + y * p->linesize[2] };
|
p->data[2] + ps * x + y * p->linesize[2] };
|
||||||
decode_rgb_frame(fs, planes, width, height, p->linesize);
|
decode_rgb_frame(fs, planes, width, height, p->linesize);
|
||||||
}
|
}
|
||||||
if (fs->ac && f->version > 2) {
|
if (fs->ac != AC_GOLOMB_RICE && f->version > 2) {
|
||||||
int v;
|
int v;
|
||||||
get_rac(&fs->c, (uint8_t[]) { 129 });
|
get_rac(&fs->c, (uint8_t[]) { 129 });
|
||||||
v = fs->c.bytestream_end - fs->c.bytestream - 2 - 5*f->ec;
|
v = fs->c.bytestream_end - fs->c.bytestream - 2 - 5*f->ec;
|
||||||
@ -539,8 +539,9 @@ static int read_extra_header(FFV1Context *f)
|
|||||||
if (f->micro_version < 0)
|
if (f->micro_version < 0)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
f->ac = f->avctx->coder_type = get_symbol(c, state, 0);
|
f->ac = get_symbol(c, state, 0);
|
||||||
if (f->ac > 1) {
|
|
||||||
|
if (f->ac == AC_RANGE_CUSTOM_TAB) {
|
||||||
for (i = 1; i < 256; i++)
|
for (i = 1; i < 256; i++)
|
||||||
f->state_transition[i] = get_symbol(c, state, 1) + c->one_state[i];
|
f->state_transition[i] = get_symbol(c, state, 1) + c->one_state[i];
|
||||||
}
|
}
|
||||||
@ -646,8 +647,9 @@ static int read_header(FFV1Context *f)
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
f->version = v;
|
f->version = v;
|
||||||
f->ac = f->avctx->coder_type = get_symbol(c, state, 0);
|
f->ac = get_symbol(c, state, 0);
|
||||||
if (f->ac > 1) {
|
|
||||||
|
if (f->ac == AC_RANGE_CUSTOM_TAB) {
|
||||||
for (i = 1; i < 256; i++)
|
for (i = 1; i < 256; i++)
|
||||||
f->state_transition[i] = get_symbol(c, state, 1) + c->one_state[i];
|
f->state_transition[i] = get_symbol(c, state, 1) + c->one_state[i];
|
||||||
}
|
}
|
||||||
|
@ -274,7 +274,7 @@ static av_always_inline int encode_line(FFV1Context *s, int w,
|
|||||||
int run_count = 0;
|
int run_count = 0;
|
||||||
int run_mode = 0;
|
int run_mode = 0;
|
||||||
|
|
||||||
if (s->ac) {
|
if (s->ac != AC_GOLOMB_RICE) {
|
||||||
if (c->bytestream_end - c->bytestream < w * 35) {
|
if (c->bytestream_end - c->bytestream < w * 35) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
|
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@ -311,7 +311,7 @@ static av_always_inline int encode_line(FFV1Context *s, int w,
|
|||||||
|
|
||||||
diff = fold(diff, bits);
|
diff = fold(diff, bits);
|
||||||
|
|
||||||
if (s->ac) {
|
if (s->ac != AC_GOLOMB_RICE) {
|
||||||
if (s->flags & AV_CODEC_FLAG_PASS1) {
|
if (s->flags & AV_CODEC_FLAG_PASS1) {
|
||||||
put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat,
|
put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat,
|
||||||
s->rc_stat2[p->quant_table_index][context]);
|
s->rc_stat2[p->quant_table_index][context]);
|
||||||
@ -501,7 +501,7 @@ static void write_header(FFV1Context *f)
|
|||||||
if (f->version < 2) {
|
if (f->version < 2) {
|
||||||
put_symbol(c, state, f->version, 0);
|
put_symbol(c, state, f->version, 0);
|
||||||
put_symbol(c, state, f->ac, 0);
|
put_symbol(c, state, f->ac, 0);
|
||||||
if (f->ac > 1) {
|
if (f->ac == AC_RANGE_CUSTOM_TAB) {
|
||||||
for (i = 1; i < 256; i++)
|
for (i = 1; i < 256; i++)
|
||||||
put_symbol(c, state,
|
put_symbol(c, state,
|
||||||
f->state_transition[i] - c->one_state[i], 1);
|
f->state_transition[i] - c->one_state[i], 1);
|
||||||
@ -566,7 +566,7 @@ static int write_extradata(FFV1Context *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
put_symbol(c, state, f->ac, 0);
|
put_symbol(c, state, f->ac, 0);
|
||||||
if (f->ac > 1)
|
if (f->ac == AC_RANGE_CUSTOM_TAB)
|
||||||
for (i = 1; i < 256; i++)
|
for (i = 1; i < 256; i++)
|
||||||
put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
|
put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
|
||||||
|
|
||||||
@ -700,7 +700,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->ac = avctx->coder_type > 0 ? 2 : 0;
|
s->ac = avctx->coder_type > 0 ? AC_RANGE_CUSTOM_TAB : AC_GOLOMB_RICE;
|
||||||
|
|
||||||
s->plane_count = 3;
|
s->plane_count = 3;
|
||||||
switch(avctx->pix_fmt) {
|
switch(avctx->pix_fmt) {
|
||||||
@ -737,13 +737,10 @@ static av_cold int encode_init(AVCodecContext *avctx)
|
|||||||
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
|
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
if (!s->ac && avctx->coder_type == -1) {
|
if (s->ac == AC_GOLOMB_RICE) {
|
||||||
av_log(avctx, AV_LOG_INFO, "bits_per_raw_sample > 8, forcing coder 1\n");
|
av_log(avctx, AV_LOG_INFO,
|
||||||
s->ac = 2;
|
"bits_per_raw_sample > 8, forcing range coder\n");
|
||||||
}
|
s->ac = AC_RANGE_CUSTOM_TAB;
|
||||||
if (!s->ac) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
|
|
||||||
return AVERROR(ENOSYS);
|
|
||||||
}
|
}
|
||||||
s->version = FFMAX(s->version, 1);
|
s->version = FFMAX(s->version, 1);
|
||||||
case AV_PIX_FMT_GRAY8:
|
case AV_PIX_FMT_GRAY8:
|
||||||
@ -794,13 +791,10 @@ static av_cold int encode_init(AVCodecContext *avctx)
|
|||||||
s->colorspace = 1;
|
s->colorspace = 1;
|
||||||
s->chroma_planes = 1;
|
s->chroma_planes = 1;
|
||||||
s->version = FFMAX(s->version, 1);
|
s->version = FFMAX(s->version, 1);
|
||||||
if (!s->ac && avctx->coder_type == -1) {
|
if (s->ac == AC_GOLOMB_RICE) {
|
||||||
av_log(avctx, AV_LOG_INFO, "bits_per_raw_sample > 8, forcing coder 1\n");
|
av_log(avctx, AV_LOG_INFO,
|
||||||
s->ac = 2;
|
"bits_per_raw_sample > 8, forcing coder 1\n");
|
||||||
}
|
s->ac = AC_RANGE_CUSTOM_TAB;
|
||||||
if (!s->ac) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
|
|
||||||
return AVERROR(ENOSYS);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -817,7 +811,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
|
|||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->ac > 1)
|
if (s->ac == AC_RANGE_CUSTOM_TAB)
|
||||||
for (i = 1; i < 256; i++)
|
for (i = 1; i < 256; i++)
|
||||||
s->state_transition[i] = ver2_state[i];
|
s->state_transition[i] = ver2_state[i];
|
||||||
|
|
||||||
@ -1150,7 +1144,7 @@ retry:
|
|||||||
if (f->version > 2) {
|
if (f->version > 2) {
|
||||||
encode_slice_header(f, fs);
|
encode_slice_header(f, fs);
|
||||||
}
|
}
|
||||||
if (!fs->ac) {
|
if (fs->ac == AC_GOLOMB_RICE) {
|
||||||
if (f->version > 2)
|
if (f->version > 2)
|
||||||
put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
|
put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
|
||||||
fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
|
fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
|
||||||
@ -1276,7 +1270,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
|||||||
f->key_frame = 0;
|
f->key_frame = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f->ac > 1) {
|
if (f->ac == AC_RANGE_CUSTOM_TAB) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 1; i < 256; i++) {
|
for (i = 1; i < 256; i++) {
|
||||||
c->one_state[i] = f->state_transition[i];
|
c->one_state[i] = f->state_transition[i];
|
||||||
@ -1298,7 +1292,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
|||||||
FFV1Context *fs = f->slice_context[i];
|
FFV1Context *fs = f->slice_context[i];
|
||||||
int bytes;
|
int bytes;
|
||||||
|
|
||||||
if (fs->ac) {
|
if (fs->ac != AC_GOLOMB_RICE) {
|
||||||
uint8_t state = 129;
|
uint8_t state = 129;
|
||||||
put_rac(&fs->c, &state, 0);
|
put_rac(&fs->c, &state, 0);
|
||||||
bytes = ff_rac_terminate(&fs->c);
|
bytes = ff_rac_terminate(&fs->c);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user