x264 would free mb_info before it was completely done using it.
/* Any MB that was coded, or that analysis decided to skip, has quality commensurate with its QP.
* But if deblocking affects neighboring MBs that were force-skipped, blur might accumulate there.
* So reset their effective QP to max, to indicate that lack of guarantee. */
- if( h->fenc->mb_info && M32( bs[0][0] ) )
+ if( h->fdec->mb_info && M32( bs[0][0] ) )
{
-#define RESET_EFFECTIVE_QP(xy) h->fdec->effective_qp[xy] |= 0xff * !!(h->fenc->mb_info[xy] & X264_MBINFO_CONSTANT);
+#define RESET_EFFECTIVE_QP(xy) h->fdec->effective_qp[xy] |= 0xff * !!(h->fdec->mb_info[xy] & X264_MBINFO_CONSTANT);
RESET_EFFECTIVE_QP(mb_xy);
RESET_EFFECTIVE_QP(h->mb.i_mb_left_xy[0]);
}
int intra_deblock = intra_cur || intra_top;
/* This edge has been modified, reset effective qp to max. */
- if( h->fenc->mb_info && M32( bs[1][0] ) )
+ if( h->fdec->mb_info && M32( bs[1][0] ) )
{
RESET_EFFECTIVE_QP(mb_xy);
RESET_EFFECTIVE_QP(h->mb.i_mb_top_xy);
else
{
/* Special fast-skip logic using information from mb_info. */
- if( h->fenc->mb_info && !SLICE_MBAFF && (h->fenc->mb_info[h->mb.i_mb_xy]&X264_MBINFO_CONSTANT) &&
- (h->fenc->i_frame - h->fref[0][0]->i_frame) == 1 && !h->sh.b_weighted_pred &&
+ if( h->fdec->mb_info && !SLICE_MBAFF && (h->fdec->mb_info[h->mb.i_mb_xy]&X264_MBINFO_CONSTANT) &&
+ (h->fdec->i_frame - h->fref[0][0]->i_frame) == 1 && !h->sh.b_weighted_pred &&
h->fref[0][0]->effective_qp[h->mb.i_mb_xy] <= h->mb.i_qp )
{
/* Use the P-SKIP MV if we can... */
x264_fdec_filter_row( h, h->i_threadslice_start + (1 << SLICE_MBAFF), 2 );
}
}
+
+ /* Free mb info after the last thread's done using it */
+ if( h->fdec->mb_info_free && (!h->param.b_sliced_threads || h->i_thread_idx == (h->param.i_threads-1)) )
+ {
+ h->fdec->mb_info_free( h->fdec->mb_info );
+ h->fdec->mb_info = NULL;
+ h->fdec->mb_info_free = NULL;
+ }
}
return 0;
h->fenc->b_kept_as_ref =
h->fdec->b_kept_as_ref = i_nal_ref_idc != NAL_PRIORITY_DISPOSABLE && h->param.i_keyint_max > 1;
+ h->fdec->mb_info = h->fenc->mb_info;
+ h->fdec->mb_info_free = h->fenc->mb_info_free;
+ h->fenc->mb_info = NULL;
+ h->fenc->mb_info_free = NULL;
+
h->fdec->i_pts = h->fenc->i_pts;
if( h->frames.i_bframe_delay )
{
x264_emms();
- if( h->fenc->mb_info_free )
- {
- h->fenc->mb_info_free( h->fenc->mb_info );
- h->fenc->mb_info = NULL;
- h->fenc->mb_info_free = NULL;
- }
-
/* generate buffering period sei and insert it into place */
if( h->i_thread_frames > 1 && h->fenc->b_keyframe && h->sps->vui.b_nal_hrd_parameters_present )
{