[FFmpeg-cvslog] r23933 - trunk/libavcodec/mpegvideo.c

mru subversion
Thu Jul 1 13:51:01 CEST 2010


Author: mru
Date: Thu Jul  1 13:51:01 2010
New Revision: 23933

Log:
Maybe fix threaded mpeg*video encoding

This allocates per-thread copies of some MpegEncContext.ac_val which
is used concurrently from the encoding threads.

Modified:
   trunk/libavcodec/mpegvideo.c

Modified: trunk/libavcodec/mpegvideo.c
==============================================================================
--- trunk/libavcodec/mpegvideo.c	Thu Jul  1 13:43:30 2010	(r23932)
+++ trunk/libavcodec/mpegvideo.c	Thu Jul  1 13:51:01 2010	(r23933)
@@ -356,6 +356,9 @@ static void free_picture(MpegEncContext 
 }
 
 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
+    int y_size = s->b8_stride * (2 * s->mb_height + 1);
+    int c_size = s->mb_stride * (s->mb_height + 1);
+    int yc_size = y_size + 2 * c_size;
     int i;
 
     // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
@@ -381,6 +384,14 @@ static int init_duplicate_context(MpegEn
     for(i=0;i<12;i++){
         s->pblocks[i] = &s->block[i];
     }
+
+    if (s->ac_val_base) {
+        FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
+        s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
+        s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
+        s->ac_val[2] = s->ac_val[1] + c_size;
+    }
+
     return 0;
 fail:
     return -1; //free() through MPV_common_end()
@@ -400,6 +411,7 @@ static void free_duplicate_context(MpegE
     av_freep(&s->me.map);
     av_freep(&s->me.score_map);
     av_freep(&s->blocks);
+    av_freep(&s->ac_val_base);
     s->block= NULL;
 }
 
@@ -423,6 +435,10 @@ static void backup_duplicate_context(Mpe
     COPY(dct_error_sum);
     COPY(dct_count[0]);
     COPY(dct_count[1]);
+    COPY(ac_val_base);
+    COPY(ac_val[0]);
+    COPY(ac_val[1]);
+    COPY(ac_val[2]);
 #undef COPY
 }
 



More information about the ffmpeg-cvslog mailing list