diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-12-18 14:38:10 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-12-18 14:38:10 +0100 |
commit | 09b4ae8331f8c073792583d1eddf96973f709c89 (patch) | |
tree | 7148f59a17305268b418abbc632b6a4f21936691 /libavcodec/h264.c | |
parent | 94ecbe23c52b699a8f2bda1cf71fb4efbf28679a (diff) | |
parent | 61c6eef5456f2bc8b1dc49a0a759c975551cea29 (diff) | |
download | ffmpeg-09b4ae8331f8c073792583d1eddf96973f709c89.tar.gz |
Merge commit '61c6eef5456f2bc8b1dc49a0a759c975551cea29'
* commit '61c6eef5456f2bc8b1dc49a0a759c975551cea29':
h264: prevent decoding of slice NALs in extradata
doxy: Clarify what avpriv_set_pts_info does
Conflicts:
libavcodec/h264.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r-- | libavcodec/h264.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 86e77567d3..750229f1c5 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -971,7 +971,8 @@ fail: return -1; // free_tables will clean up for us } -static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size); +static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size, + int parse_extradata); static av_cold void common_init(H264Context *h) { @@ -1027,7 +1028,7 @@ static int ff_h264_decode_extradata_internal(H264Context *h, const uint8_t *buf, nalsize = AV_RB16(p) + 2; if(nalsize > size - (p-buf)) return -1; - if (decode_nal_units(h, p, nalsize) < 0) { + if (decode_nal_units(h, p, nalsize, 1) < 0) { av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i); return -1; @@ -1040,7 +1041,7 @@ static int ff_h264_decode_extradata_internal(H264Context *h, const uint8_t *buf, nalsize = AV_RB16(p) + 2; if(nalsize > size - (p-buf)) return -1; - if (decode_nal_units(h, p, nalsize) < 0) { + if (decode_nal_units(h, p, nalsize, 1) < 0) { av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i); return -1; @@ -1051,7 +1052,7 @@ static int ff_h264_decode_extradata_internal(H264Context *h, const uint8_t *buf, h->nal_length_size = (buf[4] & 0x03) + 1; } else { h->is_avc = 0; - if (decode_nal_units(h, buf, size) < 0) + if (decode_nal_units(h, buf, size, 1) < 0) return -1; } return size; @@ -3778,7 +3779,8 @@ static int execute_decode_slices(H264Context *h, int context_count) return 0; } -static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size) +static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size, + int parse_extradata) { MpegEncContext *const s = &h->s; AVCodecContext *const avctx = s->avctx; @@ -3922,6 +3924,17 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size) continue; again: + /* Ignore every NAL unit type except PPS and SPS during extradata + * parsing. Decoding slices is not possible in codec init + * with frame-mt */ + if (parse_extradata && HAVE_THREADS && + (s->avctx->active_thread_type & FF_THREAD_FRAME) && + (hx->nal_unit_type != NAL_PPS && + hx->nal_unit_type != NAL_SPS)) { + av_log(avctx, AV_LOG_INFO, "Ignoring NAL unit %d during " + "extradata parsing\n", hx->nal_unit_type); + hx->nal_unit_type = NAL_FF_IGNORE; + } err = 0; if (h->decoding_extradata) { @@ -4083,6 +4096,8 @@ again: case NAL_SPS_EXT: case NAL_AUXILIARY_SLICE: break; + case NAL_FF_IGNORE: + break; default: av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)\n", hx->nal_unit_type, bit_length); @@ -4201,7 +4216,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, } not_extra: - buf_index = decode_nal_units(h, buf, buf_size); + buf_index = decode_nal_units(h, buf, buf_size, 0); if (buf_index < 0) return -1; |