summaryrefslogtreecommitdiff
path: root/libavcodec/libvpxenc.c
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2015-07-15 18:41:14 +0100
committerVittorio Giovara <vittorio.giovara@gmail.com>2015-07-20 14:13:42 +0100
commitd6006dd9f0d4d01023359230212f1f9fa4800e5b (patch)
treed2addd7deb8de8b8d254b26901c8104390f0e973 /libavcodec/libvpxenc.c
parent7fc8d8a1b3da1666176b3d92e989ee74f3ef014e (diff)
libvpxenc: Do not entangle coded_frame
Keep coded_frame.key_frame a write-only variable.
Diffstat (limited to 'libavcodec/libvpxenc.c')
-rw-r--r--libavcodec/libvpxenc.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index f690de145c..e8c7327b33 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -398,20 +398,21 @@ static inline void cx_pktcpy(struct FrameListData *dst,
* @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);
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);
-
- 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;
+ 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 (!!(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;
+ }
} else {
av_log(avctx, AV_LOG_ERROR,
"Error getting output packet of size %zu.\n", cx_frame->sz);
@@ -428,8 +429,7 @@ static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame,
* @return AVERROR(EINVAL) on output size error
* @return AVERROR(ENOMEM) on coded frame queue data allocation error
*/
-static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out,
- AVFrame *coded_frame)
+static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out)
{
VP8Context *ctx = avctx->priv_data;
const struct vpx_codec_cx_pkt *pkt;
@@ -439,7 +439,7 @@ static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out,
if (ctx->coded_frame_list) {
struct FrameListData *cx_frame = ctx->coded_frame_list;
/* return the leading frame if we've already begun queueing */
- size = storeframe(avctx, cx_frame, pkt_out, coded_frame);
+ size = storeframe(avctx, cx_frame, pkt_out);
if (size < 0)
return size;
ctx->coded_frame_list = cx_frame->next;
@@ -458,7 +458,7 @@ static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out,
provided a frame for output */
assert(!ctx->coded_frame_list);
cx_pktcpy(&cx_frame, pkt);
- size = storeframe(avctx, &cx_frame, pkt_out, coded_frame);
+ size = storeframe(avctx, &cx_frame, pkt_out);
if (size < 0)
return size;
} else {
@@ -537,7 +537,7 @@ static int vp8_encode(AVCodecContext *avctx, AVPacket *pkt,
log_encoder_error(avctx, "Error encoding frame");
return AVERROR_INVALIDDATA;
}
- coded_size = queue_frames(avctx, pkt, avctx->coded_frame);
+ coded_size = queue_frames(avctx, pkt);
if (!frame && avctx->flags & CODEC_FLAG_PASS1) {
unsigned int b64_size = AV_BASE64_SIZE(ctx->twopass_stats.sz);