#include "libavutil/pixdesc.h"
#include "libavutil/avassert.h"
#include "libavutil/crc.h"
+#include "libavutil/opt.h"
#ifdef __INTEL_COMPILER
#undef av_flatten
#define MAX_SLICES 256
typedef struct FFV1Context{
+ AVClass *class;
AVCodecContext *avctx;
RangeCoder c;
GetBitContext gb;
if(avctx->level == 3){
s->version = 3;
- s->ec = 1;
+ }
+
+ if(s->ec < 0){
+ s->ec = (s->version >= 3);
}
if(s->version >= 2 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
s->colorspace= 0;
break;
case PIX_FMT_YUVA444P:
+ case PIX_FMT_YUVA422P:
case PIX_FMT_YUVA420P:
s->chroma_planes= 1;
s->colorspace= 0;
goto slices_ok;
}
}
- av_log(avctx, AV_LOG_ERROR, "Unsupported number %d of slices requested, please specify a supported number with -slices\n", avctx->slices);
+ av_log(avctx, AV_LOG_ERROR, "Unsupported number %d of slices requested, please specify a supported number with -slices (ex:4,6,9,12,16, ...)\n", avctx->slices);
return -1;
slices_ok:
write_extra_header(s);
}
}
-static void clear_state(FFV1Context *f){
- int si;
-
- for(si=0; si<f->slice_count; si++){
- FFV1Context *fs= f->slice_context[si];
- clear_slice_state(f, fs);
- }
-}
-
#if CONFIG_FFV1_ENCODER
static void encode_slice_header(FFV1Context *f, FFV1Context *fs){
AVFrame * const p= &f->picture;
const int ps= (f->bits_per_raw_sample>8)+1;
+ if(p->key_frame)
+ clear_slice_state(f, fs);
if(f->version > 2){
encode_slice_header(f, fs);
}
p->key_frame= 1;
f->gob_count++;
write_header(f);
- clear_state(f);
}else{
put_rac(c, &keystate, 0);
p->key_frame= 0;
AVFrame * const p= &f->picture;
if(f->version > 2){
- if(decode_slice_header(f, fs) < 0)
- return AVERROR_INVALIDDATA;
-
if(init_slice_state(f, fs) < 0)
return AVERROR(ENOMEM);
+ if(decode_slice_header(f, fs) < 0)
+ return AVERROR_INVALIDDATA;
}
+ if(init_slice_state(f, fs) < 0)
+ return AVERROR(ENOMEM);
if(f->picture.key_frame)
clear_slice_state(f, fs);
width = fs->slice_width;
}else if(f->avctx->bits_per_raw_sample<=8 && f->transparency){
switch(16*f->chroma_h_shift + f->chroma_v_shift){
case 0x00: f->avctx->pix_fmt= PIX_FMT_YUVA444P; break;
+ case 0x10: f->avctx->pix_fmt= PIX_FMT_YUVA422P; break;
case 0x11: f->avctx->pix_fmt= PIX_FMT_YUVA420P; break;
default:
av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
}
if(f->version <= 2){
- if(p->context_count < context_count){
- av_freep(&p->state);
- av_freep(&p->vlc_state);
- }
- p->context_count= context_count;
+ if(p->context_count < context_count){
+ av_freep(&p->state);
+ av_freep(&p->vlc_state);
+ }
+ p->context_count= context_count;
}
}
}
FFV1Context *f = avctx->priv_data;
RangeCoder * const c= &f->slice_context[0]->c;
AVFrame * const p= &f->picture;
- int bytes_read, i;
+ int i;
uint8_t keystate= 128;
const uint8_t *buf_p;
f->key_frame_ok = 0;
if(read_header(f) < 0)
return -1;
- if(init_slices_state(f) < 0)
- return -1;
f->key_frame_ok = 1;
}else{
if (!f->key_frame_ok) {
}
p->key_frame= 0;
}
- if(f->ac>1){
- int i;
- for(i=1; i<256; i++){
- c->one_state[i]= f->state_transition[i];
- c->zero_state[256-i]= 256-c->one_state[i];
- }
- }
p->reference= 0;
if(avctx->get_buffer(avctx, p) < 0){
};
#if CONFIG_FFV1_ENCODER
+
+#define OFFSET(x) offsetof(FFV1Context, x)
+#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption options[] = {
+ { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_INT, {-1}, -1, 1, VE},
+{NULL}
+};
+
+static const AVClass class = {
+ .class_name = "ffv1 encoder",
+ .item_name = av_default_item_name,
+ .option = options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+
AVCodec ff_ffv1_encoder = {
.name = "ffv1",
.type = AVMEDIA_TYPE_VIDEO,
.capabilities = CODEC_CAP_SLICE_THREADS,
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUVA420P, PIX_FMT_YUV444P, PIX_FMT_YUVA444P, PIX_FMT_YUV440P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_0RGB32, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_YUV444P9, PIX_FMT_YUV422P9, PIX_FMT_YUV420P9, PIX_FMT_YUV420P10, PIX_FMT_YUV422P10, PIX_FMT_YUV444P10, PIX_FMT_GRAY16, PIX_FMT_GRAY8, PIX_FMT_NONE},
.long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
+ .priv_class = &class,
};
#endif