You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
avcodec/fmvc: Move frame allocation to a later stage
This way more things are checked before allocation Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
@@ -400,20 +400,17 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
|||||||
GetByteContext *gb = &s->gb;
|
GetByteContext *gb = &s->gb;
|
||||||
PutByteContext *pb = &s->pb;
|
PutByteContext *pb = &s->pb;
|
||||||
int ret, y, x;
|
int ret, y, x;
|
||||||
|
int key_frame;
|
||||||
|
|
||||||
if (avpkt->size < 8)
|
if (avpkt->size < 8)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
bytestream2_init(gb, avpkt->data, avpkt->size);
|
bytestream2_init(gb, avpkt->data, avpkt->size);
|
||||||
bytestream2_skip(gb, 2);
|
bytestream2_skip(gb, 2);
|
||||||
|
|
||||||
frame->key_frame = !!bytestream2_get_le16(gb);
|
key_frame = !!bytestream2_get_le16(gb);
|
||||||
frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
|
|
||||||
|
|
||||||
if (frame->key_frame) {
|
if (key_frame) {
|
||||||
const uint8_t *src;
|
const uint8_t *src;
|
||||||
unsigned type, size;
|
unsigned type, size;
|
||||||
uint8_t *dst;
|
uint8_t *dst;
|
||||||
@@ -433,6 +430,12 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
|||||||
return AVERROR_PATCHWELCOME;
|
return AVERROR_PATCHWELCOME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
frame->key_frame = 1;
|
||||||
|
frame->pict_type = AV_PICTURE_TYPE_I;
|
||||||
|
|
||||||
src = s->buffer;
|
src = s->buffer;
|
||||||
dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
|
dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
|
||||||
for (y = 0; y < avctx->height; y++) {
|
for (y = 0; y < avctx->height; y++) {
|
||||||
@@ -513,6 +516,12 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
|||||||
dst = &rect[block_h * s->stride];
|
dst = &rect[block_h * s->stride];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
frame->key_frame = 0;
|
||||||
|
frame->pict_type = AV_PICTURE_TYPE_P;
|
||||||
|
|
||||||
ssrc = s->buffer;
|
ssrc = s->buffer;
|
||||||
ddst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
|
ddst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
|
||||||
for (y = 0; y < avctx->height; y++) {
|
for (y = 0; y < avctx->height; y++) {
|
||||||
|
Reference in New Issue
Block a user