|
|
|
@@ -33,11 +33,23 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
AVFrame *pic = avctx->coded_frame; |
|
|
|
AVFrame *prev_pic = &zc->previous_frame; |
|
|
|
z_stream *zstream = &zc->zstream; |
|
|
|
uint8_t *prev, *dst; |
|
|
|
uint8_t *prev = prev_pic->data[0], *dst; |
|
|
|
int i, j, zret; |
|
|
|
|
|
|
|
pic->reference = 3; |
|
|
|
|
|
|
|
if (avpkt->flags & AV_PKT_FLAG_KEY) { |
|
|
|
pic->key_frame = 1; |
|
|
|
pic->pict_type = AV_PICTURE_TYPE_I; |
|
|
|
} else { |
|
|
|
if (!prev) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Missing reference frame!\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
pic->key_frame = 0; |
|
|
|
pic->pict_type = AV_PICTURE_TYPE_P; |
|
|
|
} |
|
|
|
|
|
|
|
if (avctx->get_buffer(avctx, pic) < 0) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n"); |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
@@ -53,7 +65,6 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
zstream->next_in = avpkt->data; |
|
|
|
zstream->avail_in = avpkt->size; |
|
|
|
|
|
|
|
prev = prev_pic->data[0]; |
|
|
|
dst = pic->data[0]; |
|
|
|
|
|
|
|
/** |
|
|
|
@@ -61,18 +72,6 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
* is the same as the previous frame, set it to 0. |
|
|
|
*/ |
|
|
|
|
|
|
|
if (avpkt->flags & AV_PKT_FLAG_KEY) { |
|
|
|
pic->key_frame = 1; |
|
|
|
pic->pict_type = AV_PICTURE_TYPE_I; |
|
|
|
} else { |
|
|
|
if (!prev) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Missing reference frame!\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
pic->key_frame = 0; |
|
|
|
pic->pict_type = AV_PICTURE_TYPE_P; |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < avctx->height; i++) { |
|
|
|
zstream->next_out = dst; |
|
|
|
zstream->avail_out = avctx->width << 1; |
|
|
|
@@ -96,12 +95,13 @@ static int zerocodec_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
if (prev_pic->data[0]) |
|
|
|
avctx->release_buffer(avctx, prev_pic); |
|
|
|
|
|
|
|
/* Store the previouse frame for use later */ |
|
|
|
*prev_pic = *pic; |
|
|
|
|
|
|
|
*data_size = sizeof(AVFrame); |
|
|
|
*(AVFrame *)data = *pic; |
|
|
|
|
|
|
|
/* Store the previous frame for use later. |
|
|
|
* FFSWAP ensures that e.g. pic->data is NULLed. */ |
|
|
|
FFSWAP(AVFrame, *pic, *prev_pic); |
|
|
|
|
|
|
|
return avpkt->size; |
|
|
|
} |
|
|
|
|
|
|
|
|