forked from FFmpeg/FFmpeg
ffv1dec: move header parsing into a separate function
This commit is contained in:
parent
d987feae2a
commit
f75812e054
1 changed files with 40 additions and 24 deletions
|
@ -548,11 +548,10 @@ static enum AVPixelFormat get_pixel_format(FFV1Context *f)
|
|||
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];
|
||||
int context_count = -1; //-1 to avoid warning
|
||||
RangeCoder *const c = &f->slices[0].c;
|
||||
|
||||
memset(state, 128, sizeof(state));
|
||||
|
||||
|
@ -901,31 +900,20 @@ static int find_next_slice(AVCodecContext *avctx,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
||||
int *got_frame, AVPacket *avpkt)
|
||||
static int decode_header(AVCodecContext *avctx, RangeCoder *c,
|
||||
uint8_t *buf, size_t buf_size)
|
||||
{
|
||||
uint8_t *buf = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
FFV1Context *f = avctx->priv_data;
|
||||
RangeCoder *const c = &f->slices[0].c;
|
||||
int ret, key_frame;
|
||||
int ret;
|
||||
FFV1Context *f = avctx->priv_data;
|
||||
|
||||
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_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
|
||||
|
||||
if (get_rac(c, &keystate)) {
|
||||
key_frame = AV_FRAME_FLAG_KEY;
|
||||
f->key_frame = AV_FRAME_FLAG_KEY;
|
||||
f->key_frame_ok = 0;
|
||||
if ((ret = read_header(f)) < 0)
|
||||
if ((ret = read_header(f, c)) < 0)
|
||||
return ret;
|
||||
f->key_frame_ok = 1;
|
||||
} else {
|
||||
|
@ -934,7 +922,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||
"Cannot decode non-keyframe without valid keyframe\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
key_frame = 0;
|
||||
f->key_frame = 0;
|
||||
}
|
||||
|
||||
if (f->ac != AC_GOLOMB_RICE) {
|
||||
|
@ -953,6 +941,33 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||
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,
|
||||
AV_GET_BUFFER_FLAG_REF);
|
||||
if (ret < 0)
|
||||
|
@ -961,7 +976,7 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||
p = f->picture.f;
|
||||
|
||||
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) {
|
||||
/* we have interlaced material flagged in container */
|
||||
|
@ -1013,9 +1028,10 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
|
|||
if (i) {
|
||||
ff_init_range_decoder(&sc->c, pos, len);
|
||||
ff_build_rac_states(&sc->c, 0.05 * (1LL << 32), 256 - 8);
|
||||
} else
|
||||
} else {
|
||||
sc->c = c;
|
||||
sc->c.bytestream_end = pos + len;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
avctx->execute(avctx,
|
||||
|
|
Loading…
Add table
Reference in a new issue