annotate h264_ps.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents ffb3668ff7af
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
1 /*
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
2 * H.26L/H.264/AVC/JVT/14496-10/... parameter set decoding
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
15 * Lesser General Public License for more details.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
16 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 3029
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
21
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11089
diff changeset
23 * @file
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
24 * H.264 / AVC / MPEG4 part10 parameter set decoding.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
25 * @author Michael Niedermayer <michaelni@gmx.at>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
26 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
27
12372
914f484bb476 Remove use of the deprecated function avcodec_check_dimensions(), use
stefano
parents: 11767
diff changeset
28 #include "libavcore/imgutils.h"
9012
15a3df8c01fd More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents: 9004
diff changeset
29 #include "internal.h"
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
30 #include "dsputil.h"
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
31 #include "avcodec.h"
4975
9a6a0818e93f split h264.c to move parser in its own file
aurel
parents: 4931
diff changeset
32 #include "h264.h"
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
33 #include "h264data.h" //FIXME FIXME FIXME (just for zigzag_scan)
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
34 #include "golomb.h"
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
35
1908
e20fd60b215c h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents: 1899
diff changeset
36
3284
a224d9752912 don't force asserts in release builds. 2% faster h264.
lorenm
parents: 3219
diff changeset
37 //#undef NDEBUG
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
38 #include <assert.h>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
39
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
40 static const AVRational pixel_aspect[17]={
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
41 {0, 1},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
42 {1, 1},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
43 {12, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
44 {10, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
45 {16, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
46 {40, 33},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
47 {24, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
48 {20, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
49 {32, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
50 {80, 33},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
51 {18, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
52 {15, 11},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
53 {64, 33},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
54 {160,99},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
55 {4, 3},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
56 {3, 2},
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
57 {2, 1},
4277
113f3b395bac Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents: 4276
diff changeset
58 };
113f3b395bac Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents: 4276
diff changeset
59
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
60 const uint8_t ff_h264_chroma_qp[52]={
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
61 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
62 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
63 28,29,29,30,31,32,32,33,34,34,35,35,36,36,37,37,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
64 37,38,38,38,39,39,39,39
7423
2eb0e5a2efad left_block intialisation optimisation.
michael
parents: 7421
diff changeset
65 };
4277
113f3b395bac Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents: 4276
diff changeset
66
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
67 static const uint8_t default_scaling4[2][16]={
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
68 { 6,13,20,28,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
69 13,20,28,32,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
70 20,28,32,37,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
71 28,32,37,42
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
72 },{
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
73 10,14,20,24,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
74 14,20,24,27,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
75 20,24,27,30,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
76 24,27,30,34
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
77 }};
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
78
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
79 static const uint8_t default_scaling8[2][64]={
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
80 { 6,10,13,16,18,23,25,27,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
81 10,11,16,18,23,25,27,29,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
82 13,16,18,23,25,27,29,31,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
83 16,18,23,25,27,29,31,33,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
84 18,23,25,27,29,31,33,36,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
85 23,25,27,29,31,33,36,38,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
86 25,27,29,31,33,36,38,40,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
87 27,29,31,33,36,38,40,42
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
88 },{
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
89 9,13,15,17,19,21,22,24,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
90 13,13,17,19,21,22,24,25,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
91 15,17,19,21,22,24,25,27,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
92 17,19,21,22,24,25,27,28,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
93 19,21,22,24,25,27,28,30,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
94 21,22,24,25,27,28,30,32,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
95 22,24,25,27,28,30,32,33,
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
96 24,25,27,28,30,32,33,35
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
97 }};
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
98
8263
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
99 static inline int decode_hrd_parameters(H264Context *h, SPS *sps){
2560
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
100 MpegEncContext * const s = &h->s;
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
101 int cpb_count, i;
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
102 cpb_count = get_ue_golomb_31(&s->gb) + 1;
8263
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
103
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
104 if(cpb_count > 32U){
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
105 av_log(h->s.avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
106 return -1;
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
107 }
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
108
2560
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
109 get_bits(&s->gb, 4); /* bit_rate_scale */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
110 get_bits(&s->gb, 4); /* cpb_size_scale */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
111 for(i=0; i<cpb_count; i++){
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
112 get_ue_golomb(&s->gb); /* bit_rate_value_minus1 */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
113 get_ue_golomb(&s->gb); /* cpb_size_value_minus1 */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
114 get_bits1(&s->gb); /* cbr_flag */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
115 }
8965
a5dce344904a Parse initial_cpb_removal_delay_length.
cehoyos
parents: 8956
diff changeset
116 sps->initial_cpb_removal_delay_length = get_bits(&s->gb, 5) + 1;
8107
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
117 sps->cpb_removal_delay_length = get_bits(&s->gb, 5) + 1;
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
118 sps->dpb_output_delay_length = get_bits(&s->gb, 5) + 1;
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
119 sps->time_offset_length = get_bits(&s->gb, 5);
8970
9757b2f87d83 Store CPB count in the context.
cehoyos
parents: 8967
diff changeset
120 sps->cpb_cnt = cpb_count;
8263
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
121 return 0;
2560
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
122 }
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
123
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
124 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
125 MpegEncContext * const s = &h->s;
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
126 int aspect_ratio_info_present_flag;
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
127 unsigned int aspect_ratio_idc;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
128
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
129 aspect_ratio_info_present_flag= get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
130
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
131 if( aspect_ratio_info_present_flag ) {
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
132 aspect_ratio_idc= get_bits(&s->gb, 8);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
133 if( aspect_ratio_idc == EXTENDED_SAR ) {
1548
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
134 sps->sar.num= get_bits(&s->gb, 16);
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
135 sps->sar.den= get_bits(&s->gb, 16);
8042
e70975d5ff80 uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 7993
diff changeset
136 }else if(aspect_ratio_idc < FF_ARRAY_ELEMS(pixel_aspect)){
1548
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
137 sps->sar= pixel_aspect[aspect_ratio_idc];
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
138 }else{
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1548
diff changeset
139 av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
140 return -1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
141 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
142 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
143 sps->sar.num=
1548
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
144 sps->sar.den= 0;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
145 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
146 // s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
2174
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
147
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
148 if(get_bits1(&s->gb)){ /* overscan_info_present_flag */
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
149 get_bits1(&s->gb); /* overscan_appropriate_flag */
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
150 }
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
151
10837
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
152 sps->video_signal_type_present_flag = get_bits1(&s->gb);
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
153 if(sps->video_signal_type_present_flag){
2174
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
154 get_bits(&s->gb, 3); /* video_format */
10837
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
155 sps->full_range = get_bits1(&s->gb); /* video_full_range_flag */
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
156
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
157 sps->colour_description_present_flag = get_bits1(&s->gb);
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
158 if(sps->colour_description_present_flag){
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
159 sps->color_primaries = get_bits(&s->gb, 8); /* colour_primaries */
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
160 sps->color_trc = get_bits(&s->gb, 8); /* transfer_characteristics */
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
161 sps->colorspace = get_bits(&s->gb, 8); /* matrix_coefficients */
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
162 if (sps->color_primaries >= AVCOL_PRI_NB)
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
163 sps->color_primaries = AVCOL_PRI_UNSPECIFIED;
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
164 if (sps->color_trc >= AVCOL_TRC_NB)
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
165 sps->color_trc = AVCOL_TRC_UNSPECIFIED;
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
166 if (sps->colorspace >= AVCOL_SPC_NB)
e5905bfa625d Export fullrange flag and color information for h.264
conrad
parents: 10829
diff changeset
167 sps->colorspace = AVCOL_SPC_UNSPECIFIED;
2174
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
168 }
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
169 }
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
170
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
171 if(get_bits1(&s->gb)){ /* chroma_location_info_present_flag */
9626
bd3e11b60ccd Add a chroma_sample_location field to define positioning of chroma samples
conrad
parents: 9449
diff changeset
172 s->avctx->chroma_sample_location = get_ue_golomb(&s->gb)+1; /* chroma_sample_location_type_top_field */
2174
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
173 get_ue_golomb(&s->gb); /* chroma_sample_location_type_bottom_field */
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
174 }
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
175
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
176 sps->timing_info_present_flag = get_bits1(&s->gb);
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
177 if(sps->timing_info_present_flag){
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
178 sps->num_units_in_tick = get_bits_long(&s->gb, 32);
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
179 sps->time_scale = get_bits_long(&s->gb, 32);
11076
4a95670ed5f1 Fix large timebases.
michael
parents: 10916
diff changeset
180 if(!sps->num_units_in_tick || !sps->time_scale){
10235
14353a40db5e Cosmetics: Fix typo.
cehoyos
parents: 10234
diff changeset
181 av_log(h->s.avctx, AV_LOG_ERROR, "time_scale/num_units_in_tick invalid or unsupported (%d/%d)\n", sps->time_scale, sps->num_units_in_tick);
10234
c2fc56bdee95 Check num_units_in_tick/time_scale to be valid and within the range we support.
michael
parents: 10137
diff changeset
182 return -1;
c2fc56bdee95 Check num_units_in_tick/time_scale to be valid and within the range we support.
michael
parents: 10137
diff changeset
183 }
2174
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
184 sps->fixed_frame_rate_flag = get_bits1(&s->gb);
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
185 }
6d614374d907 Get H.264 frame rate from SPS/VUI patch by (M«©ns Rullg«©rd <mru at kth dot se>)
michael
parents: 2163
diff changeset
186
8107
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
187 sps->nal_hrd_parameters_present_flag = get_bits1(&s->gb);
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
188 if(sps->nal_hrd_parameters_present_flag)
8263
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
189 if(decode_hrd_parameters(h, sps) < 0)
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
190 return -1;
8107
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
191 sps->vcl_hrd_parameters_present_flag = get_bits1(&s->gb);
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
192 if(sps->vcl_hrd_parameters_present_flag)
8263
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
193 if(decode_hrd_parameters(h, sps) < 0)
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
194 return -1;
8107
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
195 if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag)
2560
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
196 get_bits1(&s->gb); /* low_delay_hrd_flag */
8107
e61f76efc9f3 h264: Implement decoding of picture timing SEI message.
andoma
parents: 8079
diff changeset
197 sps->pic_struct_present_flag = get_bits1(&s->gb);
2560
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
198
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
199 sps->bitstream_restriction_flag = get_bits1(&s->gb);
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
200 if(sps->bitstream_restriction_flag){
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
201 get_bits1(&s->gb); /* motion_vectors_over_pic_boundaries_flag */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
202 get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
203 get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
204 get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
205 get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
206 sps->num_reorder_frames= get_ue_golomb(&s->gb);
4389
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
207 get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
208
11767
572bf2d9931e Check for VUI overeading and reset num_reoder_frames.
michael
parents: 11644
diff changeset
209 if(s->gb.size_in_bits < get_bits_count(&s->gb)){
572bf2d9931e Check for VUI overeading and reset num_reoder_frames.
michael
parents: 11644
diff changeset
210 av_log(h->s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", get_bits_count(&s->gb) - s->gb.size_in_bits);
572bf2d9931e Check for VUI overeading and reset num_reoder_frames.
michael
parents: 11644
diff changeset
211 sps->num_reorder_frames=0;
572bf2d9931e Check for VUI overeading and reset num_reoder_frames.
michael
parents: 11644
diff changeset
212 sps->bitstream_restriction_flag= 0;
572bf2d9931e Check for VUI overeading and reset num_reoder_frames.
michael
parents: 11644
diff changeset
213 }
572bf2d9931e Check for VUI overeading and reset num_reoder_frames.
michael
parents: 11644
diff changeset
214
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
215 if(sps->num_reorder_frames > 16U /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
216 av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames);
4389
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
217 return -1;
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
218 }
2560
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
219 }
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
220
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
221 return 0;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
222 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
223
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
224 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
225 const uint8_t *jvt_list, const uint8_t *fallback_list){
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
226 MpegEncContext * const s = &h->s;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
227 int i, last = 8, next = 8;
8646
8b52ac19a91c remove zigzag_scan8x8, it is the same as ff_zigzag_direct
stefang
parents: 8627
diff changeset
228 const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct;
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
229 if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
230 memcpy(factors, fallback_list, size*sizeof(uint8_t));
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
231 else
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
232 for(i=0;i<size;i++){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
233 if(next)
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
234 next = (last + get_se_golomb(&s->gb)) & 0xff;
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
235 if(!i && !next){ /* matrix not written, we use the preset one */
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
236 memcpy(factors, jvt_list, size*sizeof(uint8_t));
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
237 break;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
238 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
239 last = factors[scan[i]] = next ? next : last;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
240 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
241 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
242
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
243 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
244 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
245 MpegEncContext * const s = &h->s;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
246 int fallback_sps = !is_sps && sps->scaling_matrix_present;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
247 const uint8_t *fallback[4] = {
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
248 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
249 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
250 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
251 fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1]
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
252 };
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
253 if(get_bits1(&s->gb)){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
254 sps->scaling_matrix_present |= is_sps;
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
255 decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
256 decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
257 decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
258 decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
259 decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
260 decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
261 if(is_sps || pps->transform_8x8_mode){
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
262 decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
263 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]); // Inter, Y
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
264 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
265 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
266 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
267
8996
e65778184ded Make the following H264 functions available to the parser:
cehoyos
parents: 8991
diff changeset
268 int ff_h264_decode_seq_parameter_set(H264Context *h){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
269 MpegEncContext * const s = &h->s;
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
270 int profile_idc, level_idc;
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
271 unsigned int sps_id;
4362
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
272 int i;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
273 SPS *sps;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
274
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
275 profile_idc= get_bits(&s->gb, 8);
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
276 get_bits1(&s->gb); //constraint_set0_flag
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
277 get_bits1(&s->gb); //constraint_set1_flag
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
278 get_bits1(&s->gb); //constraint_set2_flag
2312
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
279 get_bits1(&s->gb); //constraint_set3_flag
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
280 get_bits(&s->gb, 4); // reserved
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
281 level_idc= get_bits(&s->gb, 8);
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
282 sps_id= get_ue_golomb_31(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
283
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
284 if(sps_id >= MAX_SPS_COUNT) {
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
285 av_log(h->s.avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
286 return -1;
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
287 }
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
288 sps= av_mallocz(sizeof(SPS));
5079
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
289 if(sps == NULL)
4362
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
290 return -1;
5079
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
291
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
292 sps->profile_idc= profile_idc;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
293 sps->level_idc= level_idc;
2312
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
294
7892
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
295 memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4));
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
296 memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8));
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
297 sps->scaling_matrix_present = 0;
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
298
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
299 if(sps->profile_idc >= 100){ //high profile
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
300 sps->chroma_format_idc= get_ue_golomb_31(&s->gb);
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
301 if(sps->chroma_format_idc == 3)
8735
5d7ebbb7e91b Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents: 8727
diff changeset
302 sps->residual_color_transform_flag = get_bits1(&s->gb);
5d7ebbb7e91b Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents: 8727
diff changeset
303 sps->bit_depth_luma = get_ue_golomb(&s->gb) + 8;
5d7ebbb7e91b Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents: 8727
diff changeset
304 sps->bit_depth_chroma = get_ue_golomb(&s->gb) + 8;
2763
01ed2c3b8f08 H.264 lossless mode
lorenm
parents: 2762
diff changeset
305 sps->transform_bypass = get_bits1(&s->gb);
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
306 decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
307 }else{
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
308 sps->chroma_format_idc= 1;
10826
59c35482189e Always initialize bit_depth_luma and bit_depth_chroma in the H264
jai_menon
parents: 10811
diff changeset
309 sps->bit_depth_luma = 8;
59c35482189e Always initialize bit_depth_luma and bit_depth_chroma in the H264
jai_menon
parents: 10811
diff changeset
310 sps->bit_depth_chroma = 8;
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
311 }
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
312
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
313 sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
314 sps->poc_type= get_ue_golomb_31(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
315
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
316 if(sps->poc_type == 0){ //FIXME #define
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
317 sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
318 } else if(sps->poc_type == 1){//FIXME #define
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
319 sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
320 sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
321 sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
322 sps->poc_cycle_length = get_ue_golomb(&s->gb);
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
323
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
324 if((unsigned)sps->poc_cycle_length >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
325 av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps->poc_cycle_length);
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
326 goto fail;
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
327 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
328
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
329 for(i=0; i<sps->poc_cycle_length; i++)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
330 sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
331 }else if(sps->poc_type != 2){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1548
diff changeset
332 av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
333 goto fail;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
334 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
335
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
336 sps->ref_frame_count= get_ue_golomb_31(&s->gb);
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
337 if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count >= 32U){
2254
0dfe4e32b19c H.264 max reference pictures fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents: 2227
diff changeset
338 av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n");
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
339 goto fail;
2254
0dfe4e32b19c H.264 max reference pictures fix by (Loren Merritt <lorenm at u dot washington dot edu>)
michael
parents: 2227
diff changeset
340 }
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
341 sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb);
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
342 sps->mb_width = get_ue_golomb(&s->gb) + 1;
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
343 sps->mb_height= get_ue_golomb(&s->gb) + 1;
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
344 if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 ||
12462
ffb3668ff7af Use new imgutils.h API names, fix deprecation warnings.
stefano
parents: 12372
diff changeset
345 av_image_check_size(16*sps->mb_width, 16*sps->mb_height, 0, h->s.avctx)){
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
346 av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
347 goto fail;
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
348 }
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2417
diff changeset
349
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
350 sps->frame_mbs_only_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
351 if(!sps->frame_mbs_only_flag)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
352 sps->mb_aff= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
353 else
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
354 sps->mb_aff= 0;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
355
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
356 sps->direct_8x8_inference_flag= get_bits1(&s->gb);
11089
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
357 if(!sps->frame_mbs_only_flag && !sps->direct_8x8_inference_flag){
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
358 av_log(h->s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n");
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
359 goto fail;
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
360 }
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
361
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
362 #ifndef ALLOW_INTERLACE
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
363 if(sps->mb_aff)
3954
00a12ef7d800 output typo fixes
diego
parents: 3948
diff changeset
364 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
365 #endif
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
366 sps->crop= get_bits1(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
367 if(sps->crop){
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
368 sps->crop_left = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
369 sps->crop_right = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
370 sps->crop_top = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
371 sps->crop_bottom= get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
372 if(sps->crop_left || sps->crop_top){
2628
511e3afc43e1 Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents: 2623
diff changeset
373 av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n");
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
374 }
7844
d35a71a3db5f Fix incorrect printing of brainfart cropping error in some cases in progressive mode.
darkshikari
parents: 7831
diff changeset
375 if(sps->crop_right >= 8 || sps->crop_bottom >= (8>> !sps->frame_mbs_only_flag)){
6581
e6d8c5bbeeac Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents: 6524
diff changeset
376 av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n");
e6d8c5bbeeac Avoid crash with idiotic cropping. Fixes crash with CVFC1_Sony_C.jsv
michael
parents: 6524
diff changeset
377 }
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
378 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
379 sps->crop_left =
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
380 sps->crop_right =
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
381 sps->crop_top =
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
382 sps->crop_bottom= 0;
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
383 }
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
384
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
385 sps->vui_parameters_present_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
386 if( sps->vui_parameters_present_flag )
9911
14edbbff0f25 H.264: Check the return value of decode_vui_parameters()
astrange
parents: 9910
diff changeset
387 if (decode_vui_parameters(h, sps) < 0)
14edbbff0f25 H.264: Check the return value of decode_vui_parameters()
astrange
parents: 9910
diff changeset
388 goto fail;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
389
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
390 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
9163
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
391 av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d\n",
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
392 sps_id, sps->profile_idc, sps->level_idc,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
393 sps->poc_type,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
394 sps->ref_frame_count,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
395 sps->mb_width, sps->mb_height,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
396 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
397 sps->direct_8x8_inference_flag ? "8B8" : "",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
398 sps->crop_left, sps->crop_right,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
399 sps->crop_top, sps->crop_bottom,
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
400 sps->vui_parameters_present_flag ? "VUI" : "",
9163
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
401 ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc],
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
402 sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
403 sps->timing_info_present_flag ? sps->time_scale : 0
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
404 );
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
405 }
8688
5cf9f2f663b0 cosmetics: Add empty line for consistent formatting.
diego
parents: 8646
diff changeset
406
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
407 av_free(h->sps_buffers[sps_id]);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
408 h->sps_buffers[sps_id]= sps;
8991
ca768cb2bfb6 Use last decoded SPS as current SPS in order to parse picture timing SEI
cehoyos
parents: 8987
diff changeset
409 h->sps = *sps;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
410 return 0;
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
411 fail:
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
412 av_free(sps);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
413 return -1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
414 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
415
5226
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
416 static void
5231
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
417 build_qp_table(PPS *pps, int t, int index)
5226
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
418 {
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
419 int i;
7347
612a78c3b128 qscale has a range of 0..51 we thus do not need a 256 entry table and neither need
michael
parents: 7346
diff changeset
420 for(i = 0; i < 52; i++)
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
421 pps->chroma_qp_table[t][i] = ff_h264_chroma_qp[av_clip(i + index, 0, 51)];
5226
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
422 }
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
423
8996
e65778184ded Make the following H264 functions available to the parser:
cehoyos
parents: 8991
diff changeset
424 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
425 MpegEncContext * const s = &h->s;
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
426 unsigned int pps_id= get_ue_golomb(&s->gb);
4362
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
427 PPS *pps;
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
428
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
429 if(pps_id >= MAX_PPS_COUNT) {
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
430 av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
4362
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
431 return -1;
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
432 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
433
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
434 pps= av_mallocz(sizeof(PPS));
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
435 if(pps == NULL)
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
436 return -1;
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
437 pps->sps_id= get_ue_golomb_31(&s->gb);
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
438 if((unsigned)pps->sps_id>=MAX_SPS_COUNT || h->sps_buffers[pps->sps_id] == NULL){
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
439 av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n");
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
440 goto fail;
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
441 }
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
442
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
443 pps->cabac= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
444 pps->pic_order_present= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
445 pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
446 if(pps->slice_group_count > 1 ){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
447 pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1548
diff changeset
448 av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n");
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
449 switch(pps->mb_slice_group_map_type){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
450 case 0:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
451 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
452 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
453 | run_length[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
454 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
455 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
456 case 2:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
457 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
458 | for( i = 0; i < num_slice_groups_minus1; i++ ) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
459 |{ | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
460 | top_left_mb[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
461 | bottom_right_mb[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
462 | } | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
463 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
464 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
465 case 3:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
466 case 4:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
467 case 5:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
468 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
469 | slice_group_change_direction_flag |1 |u(1) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
470 | slice_group_change_rate_minus1 |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
471 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
472 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
473 case 6:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
474 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
475 | slice_group_id_cnt_minus1 |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
476 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
477 |) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
478 | slice_group_id[ i ] |1 |u(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
479 #endif
1214
327c5a36dfe7 fixing mixed dr1 + internal buffers
michaelni
parents: 1187
diff changeset
480 break;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
481 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
482 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
483 pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
484 pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
4531
8a5a3dd25390 fix ref_count check
michael
parents: 4530
diff changeset
485 if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1548
diff changeset
486 av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
487 goto fail;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
488 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
489
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
490 pps->weighted_pred= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
491 pps->weighted_bipred_idc= get_bits(&s->gb, 2);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
492 pps->init_qp= get_se_golomb(&s->gb) + 26;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
493 pps->init_qs= get_se_golomb(&s->gb) + 26;
5231
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
494 pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
495 pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
496 pps->constrained_intra_pred= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
497 pps->redundant_pic_cnt_present = get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
498
3291
454de57e45cf reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents: 3285
diff changeset
499 pps->transform_8x8_mode= 0;
454de57e45cf reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents: 3285
diff changeset
500 h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
7892
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
501 memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4));
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
502 memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
503
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
504 if(get_bits_count(&s->gb) < bit_length){
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
505 pps->transform_8x8_mode= get_bits1(&s->gb);
5079
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
506 decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
5231
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
507 pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
508 } else {
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
509 pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
510 }
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
511
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
512 build_qp_table(pps, 0, pps->chroma_qp_index_offset[0]);
7345
a36996f67748 Deobfusate chroma_qp_table[1] init code.
michael
parents: 7344
diff changeset
513 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]);
a36996f67748 Deobfusate chroma_qp_table[1] init code.
michael
parents: 7344
diff changeset
514 if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1])
10916
042a38ba02ad 10l for someone, Store chroma_qp_diff in the correct struct.
michael
parents: 10859
diff changeset
515 pps->chroma_qp_diff= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
516
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
517 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5231
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
518 av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %s\n",
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
519 pps_id, pps->sps_id,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
520 pps->cabac ? "CABAC" : "CAVLC",
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
521 pps->slice_group_count,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
522 pps->ref_count[0], pps->ref_count[1],
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
523 pps->weighted_pred ? "weighted" : "",
5231
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
524 pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1],
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
525 pps->deblocking_filter_parameters_present ? "LPAR" : "",
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
526 pps->constrained_intra_pred ? "CONSTR" : "",
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
527 pps->redundant_pic_cnt_present ? "REDU" : "",
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
528 pps->transform_8x8_mode ? "8x8DCT" : ""
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
529 );
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
530 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
531
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
532 av_free(h->pps_buffers[pps_id]);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
533 h->pps_buffers[pps_id]= pps;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
534 return 0;
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
535 fail:
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
536 av_free(pps);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
537 return -1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
538 }