Merge commit 'd6006dd9f0d4d01023359230212f1f9fa4800e5b'
authorMichael Niedermayer <michael@niedermayer.cc>
Mon, 20 Jul 2015 20:05:27 +0000 (22:05 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Mon, 20 Jul 2015 20:05:27 +0000 (22:05 +0200)
* commit 'd6006dd9f0d4d01023359230212f1f9fa4800e5b':
  libvpxenc: Do not entangle coded_frame

Conflicts:
libavcodec/libvpxenc.c

Merged-by: Michael Niedermayer <michael@niedermayer.cc>
1  2 
libavcodec/libvpxenc.c

@@@ -692,47 -398,24 +692,48 @@@ static inline void cx_pktcpy(struct Fra
   * @return a negative AVERROR on error
   */
  static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame,
-                       AVPacket *pkt, AVFrame *coded_frame)
+                       AVPacket *pkt)
  {
 -    int ret = ff_alloc_packet(pkt, cx_frame->sz);
 +    int ret = ff_alloc_packet2(avctx, pkt, cx_frame->sz);
 +    uint8_t *side_data;
      if (ret >= 0) {
          memcpy(pkt->data, cx_frame->buf, pkt->size);
-         pkt->pts = pkt->dts    = cx_frame->pts;
-         coded_frame->pts       = cx_frame->pts;
-         coded_frame->key_frame = !!(cx_frame->flags & VPX_FRAME_IS_KEY);
+         pkt->pts = pkt->dts = cx_frame->pts;
+         avctx->coded_frame->pts       = cx_frame->pts;
+         avctx->coded_frame->key_frame = !!(cx_frame->flags & VPX_FRAME_IS_KEY);
  
-         if (coded_frame->key_frame) {
-             coded_frame->pict_type = AV_PICTURE_TYPE_I;
-             pkt->flags            |= AV_PKT_FLAG_KEY;
-         } else
-             coded_frame->pict_type = AV_PICTURE_TYPE_P;
+         if (!!(cx_frame->flags & VPX_FRAME_IS_KEY)) {
+             avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
+             pkt->flags |= AV_PKT_FLAG_KEY;
+         } else {
+             avctx->coded_frame->pict_type = AV_PICTURE_TYPE_P;
+         }
 +
 +        if (cx_frame->have_sse) {
 +            int i;
 +            /* Beware of the Y/U/V/all order! */
-             coded_frame->error[0] = cx_frame->sse[1];
-             coded_frame->error[1] = cx_frame->sse[2];
-             coded_frame->error[2] = cx_frame->sse[3];
-             coded_frame->error[3] = 0;    // alpha
++            avctx->coded_frame->error[0] = cx_frame->sse[1];
++            avctx->coded_frame->error[1] = cx_frame->sse[2];
++            avctx->coded_frame->error[2] = cx_frame->sse[3];
++            avctx->coded_frame->error[3] = 0;    // alpha
 +            for (i = 0; i < 4; ++i) {
-                 avctx->error[i] += coded_frame->error[i];
++                avctx->error[i] += avctx->coded_frame->error[i];
 +            }
 +            cx_frame->have_sse = 0;
 +        }
 +        if (cx_frame->sz_alpha > 0) {
 +            side_data = av_packet_new_side_data(pkt,
 +                                                AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
 +                                                cx_frame->sz_alpha + 8);
 +            if(!side_data) {
 +                av_free_packet(pkt);
 +                av_free(pkt);
 +                return AVERROR(ENOMEM);
 +            }
 +            AV_WB64(side_data, 1);
 +            memcpy(side_data + 8, cx_frame->buf_alpha, cx_frame->sz_alpha);
 +        }
      } else {
 -        av_log(avctx, AV_LOG_ERROR,
 -               "Error getting output packet of size %zu.\n", cx_frame->sz);
          return ret;
      }
      return pkt->size;
@@@ -778,9 -456,9 +778,9 @@@ static int queue_frames(AVCodecContext 
  
                  /* avoid storing the frame when the list is empty and we haven't yet
                     provided a frame for output */
 -                assert(!ctx->coded_frame_list);
 -                cx_pktcpy(&cx_frame, pkt);
 +                av_assert0(!ctx->coded_frame_list);
 +                cx_pktcpy(&cx_frame, pkt, pkt_alpha, ctx);
-                 size = storeframe(avctx, &cx_frame, pkt_out, coded_frame);
+                 size = storeframe(avctx, &cx_frame, pkt_out);
                  if (size < 0)
                      return size;
              } else {
@@@ -897,17 -537,7 +897,17 @@@ static int vp8_encode(AVCodecContext *a
          log_encoder_error(avctx, "Error encoding frame");
          return AVERROR_INVALIDDATA;
      }
-     coded_size = queue_frames(avctx, pkt, avctx->coded_frame);
 +
 +    if (ctx->is_alpha) {
 +        res = vpx_codec_encode(&ctx->encoder_alpha, rawimg_alpha, timestamp,
 +                               avctx->ticks_per_frame, flags, ctx->deadline);
 +        if (res != VPX_CODEC_OK) {
 +            log_encoder_error(avctx, "Error encoding alpha frame");
 +            return AVERROR_INVALIDDATA;
 +        }
 +    }
 +
+     coded_size = queue_frames(avctx, pkt);
  
      if (!frame && avctx->flags & CODEC_FLAG_PASS1) {
          unsigned int b64_size = AV_BASE64_SIZE(ctx->twopass_stats.sz);