mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-14 22:22:59 +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;
|
uint8_t *bitstream;
|
||||||
int bitstream_size;
|
int bitstream_size;
|
||||||
|
|
||||||
int changed_size;
|
|
||||||
int factor;
|
int factor;
|
||||||
unsigned lo;
|
unsigned lo;
|
||||||
unsigned hi;
|
unsigned hi;
|
||||||
@ -370,6 +369,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
IMM4Context *s = avctx->priv_data;
|
IMM4Context *s = avctx->priv_data;
|
||||||
GetBitContext *gb = &s->gb;
|
GetBitContext *gb = &s->gb;
|
||||||
AVFrame *frame = data;
|
AVFrame *frame = data;
|
||||||
|
int width, height;
|
||||||
unsigned type;
|
unsigned type;
|
||||||
int ret, scaled;
|
int ret, scaled;
|
||||||
|
|
||||||
@ -391,9 +391,11 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
avctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
avctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
||||||
avctx->color_range = AVCOL_RANGE_JPEG;
|
avctx->color_range = AVCOL_RANGE_JPEG;
|
||||||
|
|
||||||
|
width = avctx->width;
|
||||||
|
height = avctx->height;
|
||||||
|
|
||||||
scaled = avpkt->data[8];
|
scaled = avpkt->data[8];
|
||||||
if (scaled < 2) {
|
if (scaled < 2) {
|
||||||
int width, height;
|
|
||||||
int mode = avpkt->data[10];
|
int mode = avpkt->data[10];
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
@ -422,18 +424,8 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
height = 576;
|
height = 576;
|
||||||
break;
|
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);
|
skip_bits_long(gb, 24 * 8);
|
||||||
type = get_bits_long(gb, 32);
|
type = get_bits_long(gb, 32);
|
||||||
s->hi = get_bits(gb, 16);
|
s->hi = get_bits(gb, 16);
|
||||||
@ -453,6 +445,17 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
return AVERROR_PATCHWELCOME;
|
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)
|
if ((ret = ff_get_buffer(avctx, frame, frame->key_frame ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user