dfa: support decoding version=1.0
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
							parent
							
								
									1cb02d4fbc
								
							
						
					
					
						commit
						1557f34b10
					
				@ -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));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user