Merge commit 'aec25b1c4650944d32706bfd40eb02bbd5587303'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 4 Jan 2014 01:56:29 +0000 (02:56 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 4 Jan 2014 01:56:29 +0000 (02:56 +0100)
* commit 'aec25b1c4650944d32706bfd40eb02bbd5587303':
  mpegvideo: split the encoding-only parts of frame_start() into a separate function

Conflicts:
libavcodec/mpegvideo.c
libavcodec/mpegvideo_enc.c

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

@@@ -1681,11 -1609,13 +1656,6 @@@ int ff_MPV_frame_start(MpegEncContext *
          s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
      }
  
-     if (s->dct_error_sum) {
-         av_assert2(s->avctx->noise_reduction && s->encoding);
-         update_noise_reduction(s);
-     }
 -#if FF_API_XVMC
 -FF_DISABLE_DEPRECATION_WARNINGS
 -    if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
 -        return ff_xvmc_field_start(s, avctx);
 -FF_ENABLE_DEPRECATION_WARNINGS
 -#endif /* FF_API_XVMC */
--
      return 0;
  }
  
@@@ -1505,8 -1385,101 +1505,101 @@@ static void frame_end(MpegEncContext *s
  
  }
  
 -        assert(s->avctx->noise_reduction && s->encoding);
+ static void update_noise_reduction(MpegEncContext *s)
+ {
+     int intra, i;
+     for (intra = 0; intra < 2; intra++) {
+         if (s->dct_count[intra] > (1 << 16)) {
+             for (i = 0; i < 64; i++) {
+                 s->dct_error_sum[intra][i] >>= 1;
+             }
+             s->dct_count[intra] >>= 1;
+         }
+         for (i = 0; i < 64; i++) {
+             s->dct_offset[intra][i] = (s->avctx->noise_reduction *
+                                        s->dct_count[intra] +
+                                        s->dct_error_sum[intra][i] / 2) /
+                                       (s->dct_error_sum[intra][i] + 1);
+         }
+     }
+ }
+ static int frame_start(MpegEncContext *s)
+ {
+     int ret;
+     /* mark & release old frames */
+     if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
+         s->last_picture_ptr != s->next_picture_ptr &&
+         s->last_picture_ptr->f.buf[0]) {
+         ff_mpeg_unref_picture(s, s->last_picture_ptr);
+     }
+     s->current_picture_ptr->f.pict_type = s->pict_type;
+     s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
+     ff_mpeg_unref_picture(s, &s->current_picture);
+     if ((ret = ff_mpeg_ref_picture(s, &s->current_picture,
+                                    s->current_picture_ptr)) < 0)
+         return ret;
+     if (s->pict_type != AV_PICTURE_TYPE_B) {
+         s->last_picture_ptr = s->next_picture_ptr;
+         if (!s->droppable)
+             s->next_picture_ptr = s->current_picture_ptr;
+     }
+     if (s->last_picture_ptr) {
+         ff_mpeg_unref_picture(s, &s->last_picture);
+         if (s->last_picture_ptr->f.buf[0] &&
+             (ret = ff_mpeg_ref_picture(s, &s->last_picture,
+                                        s->last_picture_ptr)) < 0)
+             return ret;
+     }
+     if (s->next_picture_ptr) {
+         ff_mpeg_unref_picture(s, &s->next_picture);
+         if (s->next_picture_ptr->f.buf[0] &&
+             (ret = ff_mpeg_ref_picture(s, &s->next_picture,
+                                        s->next_picture_ptr)) < 0)
+             return ret;
+     }
+     if (s->picture_structure!= PICT_FRAME) {
+         int i;
+         for (i = 0; i < 4; i++) {
+             if (s->picture_structure == PICT_BOTTOM_FIELD) {
+                 s->current_picture.f.data[i] +=
+                     s->current_picture.f.linesize[i];
+             }
+             s->current_picture.f.linesize[i] *= 2;
+             s->last_picture.f.linesize[i]    *= 2;
+             s->next_picture.f.linesize[i]    *= 2;
+         }
+     }
+     if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
+         s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
+         s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
+     } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
+         s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
+         s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
+     } else {
+         s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
+         s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
+     }
+     if (s->dct_error_sum) {
++        av_assert2(s->avctx->noise_reduction && s->encoding);
+         update_noise_reduction(s);
+     }
+     return 0;
+ }
  int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
 -                          const AVFrame *pic_arg, int *got_packet)
 +                          AVFrame *pic_arg, int *got_packet)
  {
      MpegEncContext *s = avctx->priv_data;
      int i, stuffing_count, ret;