[FFmpeg-cvslog] dfa: support decoding version=1.0

Michael Niedermayer git at videolan.org
Mon Apr 15 12:15:13 CEST 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Mon Apr 15 12:07:12 2013 +0200| [1557f34b10e6095a5cbf13ac5fcd3c095e2a93af] | committer: Michael Niedermayer

dfa: support decoding version=1.0

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1557f34b10e6095a5cbf13ac5fcd3c095e2a93af
---

 libavcodec/dfa.c  |   13 +++++++++++--
 libavformat/dfa.c |   10 +++++++++-
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/libavcodec/dfa.c b/libavcodec/dfa.c
index 3245909..6a095b2 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 8cf2f24..5799d98 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;
 }
 



More information about the ffmpeg-cvslog mailing list