From c34a96a5ddfa390ce2a352eca79190766c9056d4 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Sat, 17 Aug 2013 12:36:36 +0200 Subject: [PATCH] dxa: fix decoding of first I-frame by separating I/P-frame decoding 5ef7c84 broke decoding for the first keyframe due to an unnecessary check for a reference frame. CC: libav-stable@libav.org --- libavcodec/dxa.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/libavcodec/dxa.c b/libavcodec/dxa.c index ddc31f3413..30fd1cebc6 100644 --- a/libavcodec/dxa.c +++ b/libavcodec/dxa.c @@ -252,22 +252,27 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac } break; case 2: - case 3: case 4: + frame->key_frame = 1; + frame->pict_type = AV_PICTURE_TYPE_I; + for (j = 0; j < avctx->height; j++) { + memcpy(outptr, srcptr, avctx->width); + outptr += stride; + srcptr += avctx->width; + } + break; + case 3: case 5: if (!tmpptr) { av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n"); return AVERROR_INVALIDDATA; } - frame->key_frame = !(compr & 1); - frame->pict_type = (compr & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; - for(j = 0; j < avctx->height; j++){ - if(compr & 1){ - for(i = 0; i < avctx->width; i++) - outptr[i] = srcptr[i] ^ tmpptr[i]; - tmpptr += stride; - }else - memcpy(outptr, srcptr, avctx->width); + frame->key_frame = 0; + frame->pict_type = AV_PICTURE_TYPE_P; + for (j = 0; j < avctx->height; j++) { + for (i = 0; i < avctx->width; i++) + outptr[i] = srcptr[i] ^ tmpptr[i]; + tmpptr += stride; outptr += stride; srcptr += avctx->width; }