Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n2.0
| @@ -340,6 +340,7 @@ static int dfa_decode_frame(AVCodecContext *avctx, | |||||
| uint8_t *dst; | uint8_t *dst; | ||||
| int ret; | int ret; | ||||
| int i, pal_elems; | int i, pal_elems; | ||||
| int version = avctx->extradata_size==2 ? AV_RL16(avctx->extradata) : 0; | |||||
| if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) | if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) | ||||
| return ret; | return ret; | ||||
| @@ -374,9 +375,17 @@ static int dfa_decode_frame(AVCodecContext *avctx, | |||||
| buf = s->frame_buf; | buf = s->frame_buf; | ||||
| dst = frame->data[0]; | dst = frame->data[0]; | ||||
| for (i = 0; i < avctx->height; i++) { | 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]; | dst += frame->linesize[0]; | ||||
| buf += avctx->width; | |||||
| } | } | ||||
| memcpy(frame->data[1], s->pal, sizeof(s->pal)); | memcpy(frame->data[1], s->pal, sizeof(s->pal)); | ||||
| @@ -36,13 +36,15 @@ static int dfa_read_header(AVFormatContext *s) | |||||
| AVIOContext *pb = s->pb; | AVIOContext *pb = s->pb; | ||||
| AVStream *st; | AVStream *st; | ||||
| int frames; | int frames; | ||||
| int version; | |||||
| uint32_t mspf; | uint32_t mspf; | ||||
| if (avio_rl32(pb) != MKTAG('D', 'F', 'I', 'A')) { | if (avio_rl32(pb) != MKTAG('D', 'F', 'I', 'A')) { | ||||
| av_log(s, AV_LOG_ERROR, "Invalid magic for DFA\n"); | av_log(s, AV_LOG_ERROR, "Invalid magic for DFA\n"); | ||||
| return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
| } | } | ||||
| avio_skip(pb, 2); // unused | |||||
| version = avio_rl16(pb); | |||||
| frames = avio_rl16(pb); | frames = avio_rl16(pb); | ||||
| st = avformat_new_stream(s, NULL); | st = avformat_new_stream(s, NULL); | ||||
| @@ -62,6 +64,12 @@ static int dfa_read_header(AVFormatContext *s) | |||||
| avio_skip(pb, 128 - 16); // padding | avio_skip(pb, 128 - 16); // padding | ||||
| st->duration = frames; | 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; | return 0; | ||||
| } | } | ||||