From 381a722562bcc0b623acf6a00a583fe989bcb72a Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 30 Nov 2013 11:34:37 +0100 Subject: [PATCH] mpegvideo: split the encoding-only parts of ff_MPV_frame_end() into a separate function --- libavcodec/mpegvideo.c | 20 ++------------------ libavcodec/mpegvideo_enc.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 8ca5e3b..6301090 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -1657,12 +1657,9 @@ FF_ENABLE_DEPRECATION_WARNINGS return 0; } -/* generic function for encode/decode called after a - * frame has been coded/decoded. */ +/* called after a frame has been decoded. */ void ff_MPV_frame_end(MpegEncContext *s) { - int i; - #if FF_API_XVMC FF_DISABLE_DEPRECATION_WARNINGS /* redraw edges for the frame if decoding didn't complete */ @@ -1672,7 +1669,7 @@ FF_DISABLE_DEPRECATION_WARNINGS } else FF_ENABLE_DEPRECATION_WARNINGS #endif /* FF_API_XVMC */ - if ((s->er.error_count || s->encoding) && + if (s->er.error_count && !s->avctx->hwaccel && s->unrestricted_mv && s->current_picture.reference && @@ -1697,11 +1694,6 @@ FF_ENABLE_DEPRECATION_WARNINGS emms_c(); - s->last_pict_type = s->pict_type; - s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality; - if (s->pict_type!= AV_PICTURE_TYPE_B) { - s->last_non_b_pict_type = s->pict_type; - } #if 0 /* copy back current_picture variables */ for (i = 0; i < MAX_PICTURE_COUNT; i++) { @@ -1713,20 +1705,12 @@ FF_ENABLE_DEPRECATION_WARNINGS assert(i < MAX_PICTURE_COUNT); #endif - if (s->encoding) { - /* release non-reference frames */ - for (i = 0; i < MAX_PICTURE_COUNT; i++) { - if (!s->picture[i].reference) - ff_mpeg_unref_picture(s, &s->picture[i]); - } - } // clear copies, to avoid confusion #if 0 memset(&s->last_picture, 0, sizeof(Picture)); memset(&s->next_picture, 0, sizeof(Picture)); memset(&s->current_picture, 0, sizeof(Picture)); #endif - s->avctx->coded_frame = &s->current_picture_ptr->f; if (s->current_picture.reference) ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0); diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 470418a..258bfcf 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -1359,6 +1359,49 @@ no_output_pic: return 0; } +static void frame_end(MpegEncContext *s) +{ + int i; + + if (s->unrestricted_mv && + s->current_picture.reference && + !s->intra_only) { + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt); + int hshift = desc->log2_chroma_w; + int vshift = desc->log2_chroma_h; + s->dsp.draw_edges(s->current_picture.f.data[0], s->linesize, + s->h_edge_pos, s->v_edge_pos, + EDGE_WIDTH, EDGE_WIDTH, + EDGE_TOP | EDGE_BOTTOM); + s->dsp.draw_edges(s->current_picture.f.data[1], s->uvlinesize, + s->h_edge_pos >> hshift, s->v_edge_pos >> vshift, + EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift, + EDGE_TOP | EDGE_BOTTOM); + s->dsp.draw_edges(s->current_picture.f.data[2], s->uvlinesize, + s->h_edge_pos >> hshift, s->v_edge_pos >> vshift, + EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift, + EDGE_TOP | EDGE_BOTTOM); + } + + emms_c(); + + s->last_pict_type = s->pict_type; + s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality; + if (s->pict_type!= AV_PICTURE_TYPE_B) + s->last_non_b_pict_type = s->pict_type; + + if (s->encoding) { + /* release non-reference frames */ + for (i = 0; i < MAX_PICTURE_COUNT; i++) { + if (!s->picture[i].reference) + ff_mpeg_unref_picture(s, &s->picture[i]); + } + } + + s->avctx->coded_frame = &s->current_picture_ptr->f; + +} + int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic_arg, int *got_packet) { @@ -1414,7 +1457,7 @@ vbv_retry: avctx->p_count = s->mb_num - s->i_count - s->skip_count; avctx->skip_count = s->skip_count; - ff_MPV_frame_end(s); + frame_end(s); if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG) ff_mjpeg_encode_picture_trailer(s); -- 2.7.4