diff --git a/libavcodec/dfa.c b/libavcodec/dfa.c index 32459098a7..6a095b2db9 100644 --- a/libavcodec/dfa.c +++ b/libavcodec/dfa.c @@ -340,6 +340,7 @@ static int dfa_decode_frame(AVCodecContext *avctx, uint8_t *dst; int ret; int i, pal_elems; + int version = avctx->extradata_size==2 ? AV_RL16(avctx->extradata) : 0; if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) return ret; @@ -374,9 +375,17 @@ static int dfa_decode_frame(AVCodecContext *avctx, buf = s->frame_buf; dst = frame->data[0]; for (i = 0; i < avctx->height; i++) { - memcpy(dst, buf, avctx->width); + if(version == 0x100) { + int j; + for(j = 0; j < avctx->width; j++) { + dst[j] = buf[ (i&3)*(avctx->width /4) + (j/4) + + ((j&3)*(avctx->height/4) + (i/4))*avctx->width]; + } + } else { + memcpy(dst, buf, avctx->width); + buf += avctx->width; + } dst += frame->linesize[0]; - buf += avctx->width; } memcpy(frame->data[1], s->pal, sizeof(s->pal)); diff --git a/libavformat/dfa.c b/libavformat/dfa.c index 8cf2f24fc8..5799d983cf 100644 --- a/libavformat/dfa.c +++ b/libavformat/dfa.c @@ -36,13 +36,15 @@ static int dfa_read_header(AVFormatContext *s) AVIOContext *pb = s->pb; AVStream *st; int frames; + int version; uint32_t mspf; if (avio_rl32(pb) != MKTAG('D', 'F', 'I', 'A')) { av_log(s, AV_LOG_ERROR, "Invalid magic for DFA\n"); return AVERROR_INVALIDDATA; } - avio_skip(pb, 2); // unused + + version = avio_rl16(pb); frames = avio_rl16(pb); st = avformat_new_stream(s, NULL); @@ -62,6 +64,12 @@ static int dfa_read_header(AVFormatContext *s) avio_skip(pb, 128 - 16); // padding st->duration = frames; + st->codec->extradata = av_malloc(2); + st->codec->extradata_size = 2; + AV_WL16(st->codec->extradata, version); + if (version == 0x100) + st->sample_aspect_ratio = (AVRational){2, 1}; + return 0; }