mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
h264: discard slices of redundant pictures right after parsing the slice header
Going through the whole decoder initialization process for a slice we are not going to decode is unnecessary and potentially dangerous.
This commit is contained in:
parent
6efc463858
commit
e26c64148b
@ -1565,6 +1565,10 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
// discard redundant pictures
|
||||||
|
if (sl->redundant_pic_count > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!h->setup_finished) {
|
if (!h->setup_finished) {
|
||||||
if (sl->first_mb_addr == 0) { // FIXME better field boundary detection
|
if (sl->first_mb_addr == 0) { // FIXME better field boundary detection
|
||||||
if (h->current_slice && h->cur_pic_ptr && FIELD_PICTURE(h)) {
|
if (h->current_slice && h->cur_pic_ptr && FIELD_PICTURE(h)) {
|
||||||
|
@ -701,6 +701,9 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
|
|||||||
if ((err = ff_h264_decode_slice_header(h, sl, nal)))
|
if ((err = ff_h264_decode_slice_header(h, sl, nal)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (sl->redundant_pic_count > 0)
|
||||||
|
break;
|
||||||
|
|
||||||
if (h->sei.recovery_point.recovery_frame_cnt >= 0 && h->recovery_frame < 0) {
|
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) &
|
h->recovery_frame = (h->poc.frame_num + h->sei.recovery_point.recovery_frame_cnt) &
|
||||||
((1 << h->ps.sps->log2_max_frame_num) - 1);
|
((1 << h->ps.sps->log2_max_frame_num) - 1);
|
||||||
@ -724,8 +727,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
|
|||||||
decode_postinit(h, i >= nals_needed);
|
decode_postinit(h, i >= nals_needed);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sl->redundant_pic_count == 0 &&
|
if ((avctx->skip_frame < AVDISCARD_NONREF || nal->ref_idc) &&
|
||||||
(avctx->skip_frame < AVDISCARD_NONREF || nal->ref_idc) &&
|
|
||||||
(avctx->skip_frame < AVDISCARD_BIDIR ||
|
(avctx->skip_frame < AVDISCARD_BIDIR ||
|
||||||
sl->slice_type_nos != AV_PICTURE_TYPE_B) &&
|
sl->slice_type_nos != AV_PICTURE_TYPE_B) &&
|
||||||
(avctx->skip_frame < AVDISCARD_NONKEY ||
|
(avctx->skip_frame < AVDISCARD_NONKEY ||
|
||||||
|
Loading…
Reference in New Issue
Block a user