Commit 381a7225 authored by Anton Khirnov's avatar Anton Khirnov

mpegvideo: split the encoding-only parts of ff_MPV_frame_end() into a separate function

parent b7254288
...@@ -1657,12 +1657,9 @@ FF_ENABLE_DEPRECATION_WARNINGS ...@@ -1657,12 +1657,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
return 0; return 0;
} }
/* generic function for encode/decode called after a /* called after a frame has been decoded. */
* frame has been coded/decoded. */
void ff_MPV_frame_end(MpegEncContext *s) void ff_MPV_frame_end(MpegEncContext *s)
{ {
int i;
#if FF_API_XVMC #if FF_API_XVMC
FF_DISABLE_DEPRECATION_WARNINGS FF_DISABLE_DEPRECATION_WARNINGS
/* redraw edges for the frame if decoding didn't complete */ /* redraw edges for the frame if decoding didn't complete */
...@@ -1672,7 +1669,7 @@ FF_DISABLE_DEPRECATION_WARNINGS ...@@ -1672,7 +1669,7 @@ FF_DISABLE_DEPRECATION_WARNINGS
} else } else
FF_ENABLE_DEPRECATION_WARNINGS FF_ENABLE_DEPRECATION_WARNINGS
#endif /* FF_API_XVMC */ #endif /* FF_API_XVMC */
if ((s->er.error_count || s->encoding) && if (s->er.error_count &&
!s->avctx->hwaccel && !s->avctx->hwaccel &&
s->unrestricted_mv && s->unrestricted_mv &&
s->current_picture.reference && s->current_picture.reference &&
...@@ -1697,11 +1694,6 @@ FF_ENABLE_DEPRECATION_WARNINGS ...@@ -1697,11 +1694,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
emms_c(); 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 #if 0
/* copy back current_picture variables */ /* copy back current_picture variables */
for (i = 0; i < MAX_PICTURE_COUNT; i++) { for (i = 0; i < MAX_PICTURE_COUNT; i++) {
...@@ -1713,20 +1705,12 @@ FF_ENABLE_DEPRECATION_WARNINGS ...@@ -1713,20 +1705,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
assert(i < MAX_PICTURE_COUNT); assert(i < MAX_PICTURE_COUNT);
#endif #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 // clear copies, to avoid confusion
#if 0 #if 0
memset(&s->last_picture, 0, sizeof(Picture)); memset(&s->last_picture, 0, sizeof(Picture));
memset(&s->next_picture, 0, sizeof(Picture)); memset(&s->next_picture, 0, sizeof(Picture));
memset(&s->current_picture, 0, sizeof(Picture)); memset(&s->current_picture, 0, sizeof(Picture));
#endif #endif
s->avctx->coded_frame = &s->current_picture_ptr->f;
if (s->current_picture.reference) if (s->current_picture.reference)
ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0); ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0);
......
...@@ -1359,6 +1359,49 @@ no_output_pic: ...@@ -1359,6 +1359,49 @@ no_output_pic:
return 0; 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, int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
const AVFrame *pic_arg, int *got_packet) const AVFrame *pic_arg, int *got_packet)
{ {
...@@ -1414,7 +1457,7 @@ vbv_retry: ...@@ -1414,7 +1457,7 @@ vbv_retry:
avctx->p_count = s->mb_num - s->i_count - s->skip_count; avctx->p_count = s->mb_num - s->i_count - s->skip_count;
avctx->skip_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) if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
ff_mjpeg_encode_picture_trailer(s); ff_mjpeg_encode_picture_trailer(s);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment