1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/ffv1: Basic float16 support

Sponsored-by: Sovereign Tech Fund
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Michael Niedermayer
2025-01-18 04:25:42 +01:00
parent 114e9864e1
commit c1b330bf24
3 changed files with 20 additions and 3 deletions

View File

@ -134,6 +134,8 @@ typedef struct FFV1Context {
uint8_t state_transition[256]; uint8_t state_transition[256];
uint8_t (*initial_states[MAX_QUANT_TABLES])[32]; uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
int colorspace; int colorspace;
int flt;
int use32bit; int use32bit;

View File

@ -172,6 +172,8 @@ int ff_ffv1_read_extra_header(FFV1Context *f)
f->crcref = 0x7a8c4079; f->crcref = 0x7a8c4079;
if (f->combined_version >= 0x30003) if (f->combined_version >= 0x30003)
f->intra = ff_ffv1_get_symbol(&c, state, 0); f->intra = ff_ffv1_get_symbol(&c, state, 0);
if (f->combined_version >= 0x40004)
f->flt = ff_ffv1_get_symbol(&c, state, 0);
} }
if (f->version > 2) { if (f->version > 2) {
@ -401,9 +403,15 @@ int ff_ffv1_parse_header(FFV1Context *f, RangeCoder *c, uint8_t *state)
else if (f->avctx->bits_per_raw_sample == 14 && f->transparency) else if (f->avctx->bits_per_raw_sample == 14 && f->transparency)
f->pix_fmt = AV_PIX_FMT_GBRAP14; f->pix_fmt = AV_PIX_FMT_GBRAP14;
else if (f->avctx->bits_per_raw_sample == 16 && !f->transparency) { else if (f->avctx->bits_per_raw_sample == 16 && !f->transparency) {
if (f->flt) {
f->pix_fmt = AV_PIX_FMT_GBRPF16;
} else
f->pix_fmt = AV_PIX_FMT_GBRP16; f->pix_fmt = AV_PIX_FMT_GBRP16;
f->use32bit = 1; f->use32bit = 1;
} else if (f->avctx->bits_per_raw_sample == 16 && f->transparency) { } else if (f->avctx->bits_per_raw_sample == 16 && f->transparency) {
if (f->flt) {
f->pix_fmt = AV_PIX_FMT_GBRAPF16;
} else
f->pix_fmt = AV_PIX_FMT_GBRAP16; f->pix_fmt = AV_PIX_FMT_GBRAP16;
f->use32bit = 1; f->use32bit = 1;
} }

View File

@ -419,7 +419,7 @@ av_cold int ff_ffv1_write_extradata(AVCodecContext *avctx)
if (f->version == 3) { if (f->version == 3) {
f->micro_version = 4; f->micro_version = 4;
} else if (f->version == 4) } else if (f->version == 4)
f->micro_version = 3; f->micro_version = 4;
f->combined_version += f->micro_version; f->combined_version += f->micro_version;
put_symbol(&c, state, f->micro_version, 0); put_symbol(&c, state, f->micro_version, 0);
} }
@ -867,6 +867,8 @@ av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx,
s->bits_per_raw_sample = 14; s->bits_per_raw_sample = 14;
case AV_PIX_FMT_GBRP16: case AV_PIX_FMT_GBRP16:
case AV_PIX_FMT_GBRAP16: case AV_PIX_FMT_GBRAP16:
case AV_PIX_FMT_GBRPF16:
case AV_PIX_FMT_GBRAPF16:
if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
s->bits_per_raw_sample = 16; s->bits_per_raw_sample = 16;
else if (!s->bits_per_raw_sample) else if (!s->bits_per_raw_sample)
@ -877,7 +879,11 @@ av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx,
if (s->bits_per_raw_sample >= 16) { if (s->bits_per_raw_sample >= 16) {
s->use32bit = 1; s->use32bit = 1;
} }
s->flt = !!(desc->flags & AV_PIX_FMT_FLAG_FLOAT);
s->version = FFMAX(s->version, 1); s->version = FFMAX(s->version, 1);
if (s->flt)
s->version = FFMAX(s->version, 4);
break; break;
default: default:
av_log(avctx, AV_LOG_ERROR, "format %s not supported\n", av_log(avctx, AV_LOG_ERROR, "format %s not supported\n",
@ -1412,6 +1418,7 @@ const FFCodec ff_ffv1_encoder = {
AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY9,
AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV440P12, AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV440P12,
AV_PIX_FMT_GBRPF16,
AV_PIX_FMT_NONE AV_PIX_FMT_NONE
}, },