Merge commit 'f1d8763a02b5fce9a7d9789e049d74a45b15e1e8'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 19 Dec 2012 13:55:07 +0000 (14:55 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 19 Dec 2012 14:44:59 +0000 (15:44 +0100)
* commit 'f1d8763a02b5fce9a7d9789e049d74a45b15e1e8':
  mpegvideo: allocate scratch buffers after linesize is known

Conflicts:
libavcodec/mpegvideo.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/cavs.c
libavcodec/cavs.h
libavcodec/cavsdec.c
libavcodec/h264.c
libavcodec/mpeg12.c
libavcodec/mpegvideo.c
libavcodec/mpegvideo.h
libavcodec/mpegvideo_enc.c

@@@ -655,7 -655,7 +655,9 @@@ int ff_cavs_next_mb(AVSContext *h) 
   *
   ****************************************************************************/
  
--void ff_cavs_init_pic(AVSContext *h) {
++int ff_cavs_init_pic(AVSContext *h) {
++    MpegEncContext *s = &h->s;
++    int ret;
      int i;
  
      /* clear some predictors */
      h->luma_scan[3] = 8*h->l_stride+8;
      h->mbx = h->mby = h->mbidx = 0;
      h->flags = 0;
++
++    if (!s->edge_emu_buffer &&
++        (ret = ff_mpv_frame_size_alloc(s, h->picture.f.linesize[0])) < 0) {
++        av_log(s->avctx, AV_LOG_ERROR,
++               "get_buffer() failed to allocate context scratch buffers.\n");
++        return ret;
++    }
++    return 0;
  }
  
  /*****************************************************************************
@@@ -253,7 -253,7 +253,7 @@@ void ff_cavs_mv(AVSContext *h, enum cav
                  enum cavs_mv_pred mode, enum cavs_block size, int ref);
  void ff_cavs_init_mb(AVSContext *h);
  int  ff_cavs_next_mb(AVSContext *h);
--void ff_cavs_init_pic(AVSContext *h);
++int ff_cavs_init_pic(AVSContext *h);
  void ff_cavs_init_top_lines(AVSContext *h);
  int ff_cavs_init(AVCodecContext *avctx);
  int ff_cavs_end (AVCodecContext *avctx);
@@@ -964,9 -951,8 +964,10 @@@ static int decode_pic(AVSContext *h) 
      if(h->picture.f.data[0])
          s->avctx->release_buffer(s->avctx, &h->picture.f);
  
 -    ff_get_buffer(s->avctx, &h->picture.f);
 -    ff_cavs_init_pic(h);
 +    if ((ret = ff_get_buffer(s->avctx, &h->picture.f)) < 0)
 +        return ret;
-     ff_cavs_init_pic(h);
++    if ((ret = ff_cavs_init_pic(h)) < 0)
++        return ret;
      h->picture.poc = get_bits(&s->gb,8)*2;
  
      /* get temporal distances and MV scaling factors */
Simple merge
Simple merge
@@@ -232,6 -235,29 +232,29 @@@ static void free_frame_buffer(MpegEncCo
      av_freep(&pic->f.hwaccel_picture_private);
  }
  
 -    int alloc_size = FFALIGN(FFABS(linesize) + 32, 32);
+ int ff_mpv_frame_size_alloc(MpegEncContext *s, int linesize)
+ {
 -    FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, alloc_size * 2 * 21,
++    int alloc_size = FFALIGN(FFABS(linesize) + 64, 32);
+     // edge emu needs blocksize + filter length - 1
+     // (= 17x17 for  halfpel / 21x21 for  h264)
+     // linesize * interlaced * MBsize
++    FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, alloc_size * 4 * 21,
+                       fail);
+     FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, alloc_size * 2 * 16 * 2,
+                       fail)
+     s->me.temp         = s->me.scratchpad;
+     s->rd_scratchpad   = s->me.scratchpad;
+     s->b_scratchpad    = s->me.scratchpad;
+     s->obmc_scratchpad = s->me.scratchpad + 16;
+     return 0;
+ fail:
+     av_freep(&s->edge_emu_buffer);
+     return AVERROR(ENOMEM);
+ }
  /**
   * Allocate a frame buffer
   */
@@@ -612,6 -640,20 +644,19 @@@ int ff_mpeg_update_thread_context(AVCod
                 FF_INPUT_BUFFER_PADDING_SIZE);
      }
  
 -            return AVERROR_BUG;
+     // linesize dependend scratch buffer allocation
+     if (!s->edge_emu_buffer)
+         if (s1->linesize) {
+             if (ff_mpv_frame_size_alloc(s, s1->linesize) < 0) {
+                 av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context "
+                        "scratch buffers.\n");
+                 return AVERROR(ENOMEM);
+             }
+         } else {
+             av_log(s->avctx, AV_LOG_ERROR, "Context scratch buffers could not "
+                    "be allocated due to unknown size.\n");
+         }
      // MPEG2/interlacing info
      memcpy(&s->progressive_sequence, &s1->progressive_sequence,
             (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence);
Simple merge
@@@ -3269,16 -3148,11 +3269,18 @@@ static int encode_picture(MpegEncContex
          update_qscale(s);
      }
  
 +    if(s->codec_id != AV_CODEC_ID_AMV){
 +        if(s->q_chroma_intra_matrix   != s->q_intra_matrix  ) av_freep(&s->q_chroma_intra_matrix);
 +        if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
 +        s->q_chroma_intra_matrix   = s->q_intra_matrix;
 +        s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
 +    }
 +
      s->mb_intra=0; //for the rate distortion & bit compare functions
      for(i=1; i<context_count; i++){
-         ff_update_duplicate_context(s->thread_context[i], s);
+         ret = ff_update_duplicate_context(s->thread_context[i], s);
+         if (ret < 0)
+             return ret;
      }
  
      if(ff_init_me(s)<0)