You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
ffv1dec: move header parsing into a separate function
This commit is contained in:
@ -548,11 +548,10 @@ static enum AVPixelFormat get_pixel_format(FFV1Context *f)
|
|||||||
return ff_get_format(f->avctx, pix_fmts);
|
return ff_get_format(f->avctx, pix_fmts);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_header(FFV1Context *f)
|
static int read_header(FFV1Context *f, RangeCoder *c)
|
||||||
{
|
{
|
||||||
uint8_t state[CONTEXT_SIZE];
|
uint8_t state[CONTEXT_SIZE];
|
||||||
int context_count = -1; //-1 to avoid warning
|
int context_count = -1; //-1 to avoid warning
|
||||||
RangeCoder *const c = &f->slices[0].c;
|
|
||||||
|
|
||||||
memset(state, 128, sizeof(state));
|
memset(state, 128, sizeof(state));
|
||||||
|
|
||||||
@ -901,31 +900,20 @@ static int find_next_slice(AVCodecContext *avctx,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
static int decode_header(AVCodecContext *avctx, RangeCoder *c,
|
||||||
int *got_frame, AVPacket *avpkt)
|
uint8_t *buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
uint8_t *buf = avpkt->data;
|
int ret;
|
||||||
int buf_size = avpkt->size;
|
FFV1Context *f = avctx->priv_data;
|
||||||
FFV1Context *f = avctx->priv_data;
|
|
||||||
RangeCoder *const c = &f->slices[0].c;
|
|
||||||
int ret, key_frame;
|
|
||||||
uint8_t keystate = 128;
|
uint8_t keystate = 128;
|
||||||
uint8_t *buf_end;
|
|
||||||
AVFrame *p;
|
|
||||||
|
|
||||||
ff_progress_frame_unref(&f->last_picture);
|
|
||||||
FFSWAP(ProgressFrame, f->picture, f->last_picture);
|
|
||||||
|
|
||||||
|
|
||||||
f->avctx = avctx;
|
|
||||||
f->frame_damaged = 0;
|
|
||||||
ff_init_range_decoder(c, buf, buf_size);
|
ff_init_range_decoder(c, buf, buf_size);
|
||||||
ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
|
ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
|
||||||
|
|
||||||
if (get_rac(c, &keystate)) {
|
if (get_rac(c, &keystate)) {
|
||||||
key_frame = AV_FRAME_FLAG_KEY;
|
f->key_frame = AV_FRAME_FLAG_KEY;
|
||||||
f->key_frame_ok = 0;
|
f->key_frame_ok = 0;
|
||||||
if ((ret = read_header(f)) < 0)
|
if ((ret = read_header(f, c)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
f->key_frame_ok = 1;
|
f->key_frame_ok = 1;
|
||||||
} else {
|
} else {
|
||||||
@ -934,7 +922,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||||||
"Cannot decode non-keyframe without valid keyframe\n");
|
"Cannot decode non-keyframe without valid keyframe\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
key_frame = 0;
|
f->key_frame = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f->ac != AC_GOLOMB_RICE) {
|
if (f->ac != AC_GOLOMB_RICE) {
|
||||||
@ -953,6 +941,33 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
||||||
|
int *got_frame, AVPacket *avpkt)
|
||||||
|
{
|
||||||
|
uint8_t *buf = avpkt->data;
|
||||||
|
int buf_size = avpkt->size;
|
||||||
|
FFV1Context *f = avctx->priv_data;
|
||||||
|
int ret;
|
||||||
|
uint8_t *buf_end;
|
||||||
|
AVFrame *p;
|
||||||
|
|
||||||
|
/* This is copied onto the first slice's range coder context */
|
||||||
|
RangeCoder c;
|
||||||
|
|
||||||
|
ff_progress_frame_unref(&f->last_picture);
|
||||||
|
FFSWAP(ProgressFrame, f->picture, f->last_picture);
|
||||||
|
|
||||||
|
|
||||||
|
f->avctx = avctx;
|
||||||
|
f->frame_damaged = 0;
|
||||||
|
|
||||||
|
ret = decode_header(avctx, &c, avpkt->data, avpkt->size);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = ff_progress_frame_get_buffer(avctx, &f->picture,
|
ret = ff_progress_frame_get_buffer(avctx, &f->picture,
|
||||||
AV_GET_BUFFER_FLAG_REF);
|
AV_GET_BUFFER_FLAG_REF);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -961,7 +976,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||||||
p = f->picture.f;
|
p = f->picture.f;
|
||||||
|
|
||||||
p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P
|
p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P
|
||||||
p->flags = (p->flags & ~AV_FRAME_FLAG_KEY) | key_frame;
|
p->flags = (p->flags & ~AV_FRAME_FLAG_KEY) | f->key_frame;
|
||||||
|
|
||||||
if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) {
|
if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) {
|
||||||
/* we have interlaced material flagged in container */
|
/* we have interlaced material flagged in container */
|
||||||
@ -1013,9 +1028,10 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||||||
if (i) {
|
if (i) {
|
||||||
ff_init_range_decoder(&sc->c, pos, len);
|
ff_init_range_decoder(&sc->c, pos, len);
|
||||||
ff_build_rac_states(&sc->c, 0.05 * (1LL << 32), 256 - 8);
|
ff_build_rac_states(&sc->c, 0.05 * (1LL << 32), 256 - 8);
|
||||||
} else
|
} else {
|
||||||
|
sc->c = c;
|
||||||
sc->c.bytestream_end = pos + len;
|
sc->c.bytestream_end = pos + len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
avctx->execute(avctx,
|
avctx->execute(avctx,
|
||||||
|
Reference in New Issue
Block a user