On 2016-06-09 10:30:14 +0200, Anton Khirnov wrote:
> This is a more appropriate place for this. H264Context.recovery_frame is
> shared between frame threads, so modifying it where it is right now is
> invalid.
> ---
> libavcodec/h264_slice.c | 18 ++++++++++++++++++
> libavcodec/h264dec.c | 18 ------------------
> 2 files changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
> index 4910396..2b7e088 100644
> --- a/libavcodec/h264_slice.c
> +++ b/libavcodec/h264_slice.c
> @@ -1335,6 +1335,24 @@ static int h264_field_start(H264Context *h, const
> H264SliceContext *sl,
>
> h->picture_idr = nal->type == H264_NAL_IDR_SLICE;
>
> + if (h->sei.recovery_point.recovery_frame_cnt >= 0 && h->recovery_frame <
> 0) {
> + h->recovery_frame = (h->poc.frame_num +
> h->sei.recovery_point.recovery_frame_cnt) &
> + ((1 << h->ps.sps->log2_max_frame_num) - 1);
> + }
> +
> + h->cur_pic_ptr->f->key_frame |= (nal->type == H264_NAL_IDR_SLICE) ||
> +
> (h->sei.recovery_point.recovery_frame_cnt >= 0);
> +
> + if (nal->type == H264_NAL_IDR_SLICE || h->recovery_frame ==
> h->poc.frame_num) {
> + h->recovery_frame = -1;
> + h->cur_pic_ptr->recovered = 1;
> + }
> + // If we have an IDR, all frames after it in decoded order are
> + // "recovered".
> + if (nal->type == H264_NAL_IDR_SLICE)
> + h->frame_recovered |= FRAME_RECOVERED_IDR;
> + h->cur_pic_ptr->recovered |= !!(h->frame_recovered &
> FRAME_RECOVERED_IDR);
unrelated, the recovery point code seems to like setting variables
redundantly.
patch ok and all patches without explicit ok from me looked ok too
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel