[SCM] libav/experimental: * DR1 support

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:34:01 UTC 2013


The following commit has been merged in the experimental branch:
commit b0397e0e003a6c633ac0ea246d41d4d1dbef0299
Author: Zdenek Kabelac <kabi at informatics.muni.cz>
Date:   Mon Nov 4 18:03:10 2002 +0000

    * DR1 support
    
    Originally committed as revision 1157 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/dv.c b/libavcodec/dv.c
index 3271490..44ee843 100644
--- a/libavcodec/dv.c
+++ b/libavcodec/dv.c
@@ -551,18 +551,39 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
     else
         mb_pos_ptr = dv_place_420;
 
+    if (avctx->flags & CODEC_FLAG_DR1 && avctx->get_buffer_callback)
+    {
+	s->width = -1;
+	avctx->dr_buffer[0] = avctx->dr_buffer[1] = avctx->dr_buffer[2] = 0;
+	if(avctx->get_buffer_callback(avctx, width, height, I_TYPE) < 0){
+	    fprintf(stderr, "get_buffer() failed\n");
+	    return -1;
+	}
+    }
+
+
     /* (re)alloc picture if needed */
     if (s->width != width || s->height != height) {
-        for(i=0;i<3;i++)
-            av_freep(&s->current_picture[i]);
+	if (!(avctx->flags & CODEC_FLAG_DR1))
+	    for(i=0;i<3;i++) {
+		if (avctx->dr_buffer[i] != s->current_picture[i])
+		    av_freep(&s->current_picture[i]);
+		avctx->dr_buffer[i] = 0;
+	    }
+
         for(i=0;i<3;i++) {
-            size = width * height;
-            s->linesize[i] = width;
-            if (i >= 1) {
-                size >>= 2;
-                s->linesize[i] >>= s->sampling_411 ? 2 : 1;
-            }
-            s->current_picture[i] = av_malloc(size);
+	    if (avctx->dr_buffer[i]) {
+		s->current_picture[i] = avctx->dr_buffer[i];
+		s->linesize[i] = (i == 0) ? avctx->dr_stride : avctx->dr_uvstride;
+	    } else {
+		size = width * height;
+		s->linesize[i] = width;
+		if (i >= 1) {
+		    size >>= 2;
+		    s->linesize[i] >>= s->sampling_411 ? 2 : 1;
+		}
+		s->current_picture[i] = av_malloc(size);
+	    }
             if (!s->current_picture[i])
                 return -1;
         }
@@ -614,6 +635,7 @@ static int dvvideo_decode_end(AVCodecContext *avctx)
     int i;
 
     for(i=0;i<3;i++)
+	if (avctx->dr_buffer[i] != s->current_picture[i])
         av_freep(&s->current_picture[i]);
     return 0;
 }
@@ -627,7 +649,7 @@ AVCodec dvvideo_decoder = {
     NULL,
     dvvideo_decode_end,
     dvvideo_decode_frame,
-    0,
+    CODEC_CAP_DR1,
     NULL
 };
 

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list