summaryrefslogtreecommitdiff
path: root/libavcodec/h264_parser.c
diff options
context:
space:
mode:
authorYusuke Nakamura <muken.the.vfrmaniac@gmail.com>2013-09-16 18:34:27 +0900
committerAnton Khirnov <anton@khirnov.net>2013-10-15 20:02:47 +0200
commitb81dbd6cb7522bea96d78a52f8a4c25a47b820c9 (patch)
tree180ef23165e09077d1abee783c2f8ed4140031f4 /libavcodec/h264_parser.c
parent6b081eff4dfc3c899960f69f30cb567266b7dca3 (diff)
h264_parser: Fix POC parsing for the case where MMCO_RESET is absent.
The prev_ values were not set after parsing POC. Increase length of the buffer decoded to parse enough safely. Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavcodec/h264_parser.c')
-rw-r--r--libavcodec/h264_parser.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index ef5da98934..75e09f400d 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -132,8 +132,8 @@ static inline int parse_nal_units(AVCodecParserContext *s,
case NAL_SLICE:
case NAL_IDR_SLICE:
// Do not walk the whole buffer just to decode slice header
- if (src_length > 20)
- src_length = 20;
+ if (src_length > 60)
+ src_length = 60;
break;
}
ptr = ff_h264_decode_nal(h, buf, &dst_length, &consumed, src_length);
@@ -219,8 +219,18 @@ static inline int parse_nal_units(AVCodecParserContext *s,
h->delta_poc[1] = get_se_golomb(&h->gb);
}
+ /* Decode POC of this picture. */
+ field_poc[0] = field_poc[1] = INT_MAX;
ff_init_poc(h, field_poc, &s->output_picture_number);
+ /* Set up the prev_ values for decoding POC of the next picture. */
+ h->prev_frame_num = h->frame_num;
+ h->prev_frame_num_offset = h->frame_num_offset;
+ if (h->nal_ref_idc != 0) {
+ h->prev_poc_msb = h->poc_msb;
+ h->prev_poc_lsb = h->poc_lsb;
+ }
+
if (h->sps.pic_struct_present_flag) {
switch (h->sei_pic_struct) {
case SEI_PIC_STRUCT_TOP_FIELD: