mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
avcodec/imm4: add support for mid-stream size changes
This commit is contained in:
parent
056a2ac168
commit
93402561fd
@ -41,7 +41,6 @@ typedef struct IMM4Context {
|
||||
uint8_t *bitstream;
|
||||
int bitstream_size;
|
||||
|
||||
int changed_size;
|
||||
int factor;
|
||||
unsigned lo;
|
||||
unsigned hi;
|
||||
@ -370,6 +369,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
||||
IMM4Context *s = avctx->priv_data;
|
||||
GetBitContext *gb = &s->gb;
|
||||
AVFrame *frame = data;
|
||||
int width, height;
|
||||
unsigned type;
|
||||
int ret, scaled;
|
||||
|
||||
@ -391,9 +391,11 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
||||
avctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
||||
avctx->color_range = AVCOL_RANGE_JPEG;
|
||||
|
||||
width = avctx->width;
|
||||
height = avctx->height;
|
||||
|
||||
scaled = avpkt->data[8];
|
||||
if (scaled < 2) {
|
||||
int width, height;
|
||||
int mode = avpkt->data[10];
|
||||
|
||||
switch (mode) {
|
||||
@ -422,18 +424,8 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
||||
height = 576;
|
||||
break;
|
||||
}
|
||||
|
||||
if (s->changed_size == 1 &&
|
||||
(avctx->width != width || avctx->height != height)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Frame size change is unsupported.\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
ret = ff_set_dimensions(avctx, width, height);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
s->changed_size = 1;
|
||||
skip_bits_long(gb, 24 * 8);
|
||||
type = get_bits_long(gb, 32);
|
||||
s->hi = get_bits(gb, 16);
|
||||
@ -453,6 +445,17 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
if (!frame->key_frame &&
|
||||
(avctx->width != width ||
|
||||
avctx->height != height)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Frame size change is unsupported.\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
ret = ff_set_dimensions(avctx, width, height);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = ff_get_buffer(avctx, frame, frame->key_frame ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
|
||||
return ret;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user