Mercurial > libavcodec.hg
annotate h264_ps.c @ 11557:53822d92c3f7 libavcodec
Make sure the EC code does not attempt to use inter based concealment if there
is no reference frame available. (this can happen because the EC code will attempt
to use reference frames even for I/IDR frames)
author | michael |
---|---|
date | Tue, 30 Mar 2010 20:46:46 +0000 |
parents | 68fa9b353337 |
children | 7dd2a45249a9 |
rev | line source |
---|---|
1168 | 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 | 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> |
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 | 8 * modify it under the terms of the GNU Lesser General Public |
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 | 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 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
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 | 20 */ |
2967 | 21 |
1168 | 22 /** |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
23 * @file libavcodec/h264_ps.c |
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 | 25 * @author Michael Niedermayer <michaelni@gmx.at> |
26 */ | |
27 | |
9012
15a3df8c01fd
More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents:
9004
diff
changeset
|
28 #include "internal.h" |
1168 | 29 #include "dsputil.h" |
30 #include "avcodec.h" | |
4975 | 31 #include "h264.h" |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
32 #include "h264data.h" //FIXME FIXME FIXME (just for zigzag_scan) |
1168 | 33 #include "golomb.h" |
34 | |
1908
e20fd60b215c
h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents:
1899
diff
changeset
|
35 |
3284
a224d9752912
don't force asserts in release builds. 2% faster h264.
lorenm
parents:
3219
diff
changeset
|
36 //#undef NDEBUG |
1168 | 37 #include <assert.h> |
38 | |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
39 static const AVRational pixel_aspect[17]={ |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
40 {0, 1}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
41 {1, 1}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
42 {12, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
43 {10, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
44 {16, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
45 {40, 33}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
46 {24, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
47 {20, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
48 {32, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
49 {80, 33}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
50 {18, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
51 {15, 11}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
52 {64, 33}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
53 {160,99}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
54 {4, 3}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
55 {3, 2}, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
56 {2, 1}, |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
57 }; |
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
58 |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
59 const uint8_t ff_h264_chroma_qp[52]={ |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
60 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
|
61 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
|
62 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
|
63 37,38,38,38,39,39,39,39 |
7423 | 64 }; |
4277
113f3b395bac
Making rem6 and div6 globally visible and thus adding prefixes.
takis
parents:
4276
diff
changeset
|
65 |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
66 static const uint8_t default_scaling4[2][16]={ |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
67 { 6,13,20,28, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
68 13,20,28,32, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
69 20,28,32,37, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
70 28,32,37,42 |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
71 },{ |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
72 10,14,20,24, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
73 14,20,24,27, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
74 20,24,27,30, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
75 24,27,30,34 |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
76 }}; |
1168 | 77 |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
78 static const uint8_t default_scaling8[2][64]={ |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
79 { 6,10,13,16,18,23,25,27, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
80 10,11,16,18,23,25,27,29, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
81 13,16,18,23,25,27,29,31, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
82 16,18,23,25,27,29,31,33, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
83 18,23,25,27,29,31,33,36, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
84 23,25,27,29,31,33,36,38, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
85 25,27,29,31,33,36,38,40, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
86 27,29,31,33,36,38,40,42 |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
87 },{ |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
88 9,13,15,17,19,21,22,24, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
89 13,13,17,19,21,22,24,25, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
90 15,17,19,21,22,24,25,27, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
91 17,19,21,22,24,25,27,28, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
92 19,21,22,24,25,27,28,30, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
93 21,22,24,25,27,28,30,32, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
94 22,24,25,27,28,30,32,33, |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
95 24,25,27,28,30,32,33,35 |
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
96 }}; |
1168 | 97 |
8263 | 98 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
|
99 MpegEncContext * const s = &h->s; |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
100 int cpb_count, i; |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
101 cpb_count = get_ue_golomb_31(&s->gb) + 1; |
8263 | 102 |
103 if(cpb_count > 32U){ | |
104 av_log(h->s.avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count); | |
105 return -1; | |
106 } | |
107 | |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
108 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
|
109 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 } |
8965 | 115 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
|
116 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
|
117 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
|
118 sps->time_offset_length = get_bits(&s->gb, 5); |
8970 | 119 sps->cpb_cnt = cpb_count; |
8263 | 120 return 0; |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
121 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
122 |
1168 | 123 static inline int decode_vui_parameters(H264Context *h, SPS *sps){ |
124 MpegEncContext * const s = &h->s; | |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
125 int aspect_ratio_info_present_flag; |
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
126 unsigned int aspect_ratio_idc; |
1168 | 127 |
128 aspect_ratio_info_present_flag= get_bits1(&s->gb); | |
2967 | 129 |
1168 | 130 if( aspect_ratio_info_present_flag ) { |
131 aspect_ratio_idc= get_bits(&s->gb, 8); | |
132 if( aspect_ratio_idc == EXTENDED_SAR ) { | |
1548 | 133 sps->sar.num= get_bits(&s->gb, 16); |
134 sps->sar.den= get_bits(&s->gb, 16); | |
8042 | 135 }else if(aspect_ratio_idc < FF_ARRAY_ELEMS(pixel_aspect)){ |
1548 | 136 sps->sar= pixel_aspect[aspect_ratio_idc]; |
1168 | 137 }else{ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
138 av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n"); |
1168 | 139 return -1; |
140 } | |
141 }else{ | |
2967 | 142 sps->sar.num= |
1548 | 143 sps->sar.den= 0; |
1168 | 144 } |
145 // 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
|
146 |
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 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
|
148 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
|
149 } |
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 |
10837
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
151 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
|
152 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
|
153 get_bits(&s->gb, 3); /* video_format */ |
10837
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
154 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
|
155 |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
156 sps->colour_description_present_flag = get_bits1(&s->gb); |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
157 if(sps->colour_description_present_flag){ |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
158 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
|
159 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
|
160 sps->colorspace = get_bits(&s->gb, 8); /* matrix_coefficients */ |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
161 if (sps->color_primaries >= AVCOL_PRI_NB) |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
162 sps->color_primaries = AVCOL_PRI_UNSPECIFIED; |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
163 if (sps->color_trc >= AVCOL_TRC_NB) |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
164 sps->color_trc = AVCOL_TRC_UNSPECIFIED; |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
165 if (sps->colorspace >= AVCOL_SPC_NB) |
e5905bfa625d
Export fullrange flag and color information for h.264
conrad
parents:
10829
diff
changeset
|
166 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
|
167 } |
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 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
|
171 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
|
172 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
|
173 } |
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 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
|
176 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
|
177 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
|
178 sps->time_scale = get_bits_long(&s->gb, 32); |
11076 | 179 if(!sps->num_units_in_tick || !sps->time_scale){ |
10235 | 180 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
|
181 return -1; |
c2fc56bdee95
Check num_units_in_tick/time_scale to be valid and within the range we support.
michael
parents:
10137
diff
changeset
|
182 } |
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
|
183 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
|
184 } |
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 |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
186 sps->nal_hrd_parameters_present_flag = get_bits1(&s->gb); |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
187 if(sps->nal_hrd_parameters_present_flag) |
8263 | 188 if(decode_hrd_parameters(h, sps) < 0) |
189 return -1; | |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
190 sps->vcl_hrd_parameters_present_flag = get_bits1(&s->gb); |
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
191 if(sps->vcl_hrd_parameters_present_flag) |
8263 | 192 if(decode_hrd_parameters(h, sps) < 0) |
193 return -1; | |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
194 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
|
195 get_bits1(&s->gb); /* low_delay_hrd_flag */ |
8107
e61f76efc9f3
h264: Implement decoding of picture timing SEI message.
andoma
parents:
8079
diff
changeset
|
196 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
|
197 |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
198 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
|
199 if(sps->bitstream_restriction_flag){ |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
200 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
|
201 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
|
202 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
|
203 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
|
204 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
|
205 sps->num_reorder_frames= get_ue_golomb(&s->gb); |
4389 | 206 get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/ |
207 | |
8235
61b5b99f3b77
Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents:
8234
diff
changeset
|
208 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
|
209 av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames); |
4389 | 210 return -1; |
211 } | |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
212 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
213 |
1168 | 214 return 0; |
215 } | |
216 | |
3004 | 217 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size, |
218 const uint8_t *jvt_list, const uint8_t *fallback_list){ | |
2919 | 219 MpegEncContext * const s = &h->s; |
220 int i, last = 8, next = 8; | |
8646
8b52ac19a91c
remove zigzag_scan8x8, it is the same as ff_zigzag_direct
stefang
parents:
8627
diff
changeset
|
221 const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct; |
3004 | 222 if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */ |
223 memcpy(factors, fallback_list, size*sizeof(uint8_t)); | |
2919 | 224 else |
225 for(i=0;i<size;i++){ | |
226 if(next) | |
227 next = (last + get_se_golomb(&s->gb)) & 0xff; | |
3004 | 228 if(!i && !next){ /* matrix not written, we use the preset one */ |
229 memcpy(factors, jvt_list, size*sizeof(uint8_t)); | |
2919 | 230 break; |
231 } | |
232 last = factors[scan[i]] = next ? next : last; | |
233 } | |
234 } | |
235 | |
236 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps, | |
237 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){ | |
238 MpegEncContext * const s = &h->s; | |
239 int fallback_sps = !is_sps && sps->scaling_matrix_present; | |
240 const uint8_t *fallback[4] = { | |
241 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0], | |
242 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1], | |
243 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0], | |
244 fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1] | |
245 }; | |
246 if(get_bits1(&s->gb)){ | |
247 sps->scaling_matrix_present |= is_sps; | |
3004 | 248 decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y |
249 decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr | |
250 decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb | |
251 decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y | |
252 decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr | |
253 decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb | |
2919 | 254 if(is_sps || pps->transform_8x8_mode){ |
3004 | 255 decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y |
256 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]); // Inter, Y | |
2919 | 257 } |
258 } | |
259 } | |
260 | |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
261 int ff_h264_decode_seq_parameter_set(H264Context *h){ |
1168 | 262 MpegEncContext * const s = &h->s; |
1371 | 263 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
|
264 unsigned int sps_id; |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
265 int i; |
1168 | 266 SPS *sps; |
2967 | 267 |
1168 | 268 profile_idc= get_bits(&s->gb, 8); |
1371 | 269 get_bits1(&s->gb); //constraint_set0_flag |
270 get_bits1(&s->gb); //constraint_set1_flag | |
271 get_bits1(&s->gb); //constraint_set2_flag | |
2312 | 272 get_bits1(&s->gb); //constraint_set3_flag |
273 get_bits(&s->gb, 4); // reserved | |
1168 | 274 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
|
275 sps_id= get_ue_golomb_31(&s->gb); |
2967 | 276 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
277 if(sps_id >= MAX_SPS_COUNT) { |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
278 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
|
279 return -1; |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
280 } |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
281 sps= av_mallocz(sizeof(SPS)); |
5079 | 282 if(sps == NULL) |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
283 return -1; |
5079 | 284 |
1168 | 285 sps->profile_idc= profile_idc; |
286 sps->level_idc= level_idc; | |
2312 | 287 |
7892
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
288 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
|
289 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
|
290 sps->scaling_matrix_present = 0; |
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
291 |
2755 | 292 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
|
293 sps->chroma_format_idc= get_ue_golomb_31(&s->gb); |
7407 | 294 if(sps->chroma_format_idc == 3) |
8735
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
295 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
|
296 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
|
297 sps->bit_depth_chroma = get_ue_golomb(&s->gb) + 8; |
2763 | 298 sps->transform_bypass = get_bits1(&s->gb); |
2919 | 299 decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8); |
7407 | 300 }else{ |
301 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
|
302 sps->bit_depth_luma = 8; |
59c35482189e
Always initialize bit_depth_luma and bit_depth_chroma in the H264
jai_menon
parents:
10811
diff
changeset
|
303 sps->bit_depth_chroma = 8; |
7407 | 304 } |
2755 | 305 |
1168 | 306 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
|
307 sps->poc_type= get_ue_golomb_31(&s->gb); |
2967 | 308 |
1168 | 309 if(sps->poc_type == 0){ //FIXME #define |
310 sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4; | |
311 } else if(sps->poc_type == 1){//FIXME #define | |
312 sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb); | |
313 sps->offset_for_non_ref_pic= get_se_golomb(&s->gb); | |
314 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
|
315 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
|
316 |
61b5b99f3b77
Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents:
8234
diff
changeset
|
317 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
|
318 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
|
319 goto fail; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
320 } |
2967 | 321 |
1168 | 322 for(i=0; i<sps->poc_cycle_length; i++) |
323 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
|
324 }else if(sps->poc_type != 2){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
325 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
|
326 goto fail; |
1168 | 327 } |
328 | |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
329 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
|
330 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
|
331 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
|
332 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
|
333 } |
1371 | 334 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
|
335 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
|
336 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
|
337 if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 || |
61b5b99f3b77
Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents:
8234
diff
changeset
|
338 avcodec_check_dimensions(NULL, 16*sps->mb_width, 16*sps->mb_height)){ |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
339 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
|
340 goto fail; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
341 } |
2422 | 342 |
1168 | 343 sps->frame_mbs_only_flag= get_bits1(&s->gb); |
344 if(!sps->frame_mbs_only_flag) | |
345 sps->mb_aff= get_bits1(&s->gb); | |
346 else | |
347 sps->mb_aff= 0; | |
348 | |
349 sps->direct_8x8_inference_flag= get_bits1(&s->gb); | |
11089 | 350 if(!sps->frame_mbs_only_flag && !sps->direct_8x8_inference_flag){ |
351 av_log(h->s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n"); | |
352 goto fail; | |
353 } | |
1168 | 354 |
3316 | 355 #ifndef ALLOW_INTERLACE |
356 if(sps->mb_aff) | |
3954 | 357 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n"); |
3316 | 358 #endif |
1371 | 359 sps->crop= get_bits1(&s->gb); |
360 if(sps->crop){ | |
361 sps->crop_left = get_ue_golomb(&s->gb); | |
362 sps->crop_right = get_ue_golomb(&s->gb); | |
363 sps->crop_top = get_ue_golomb(&s->gb); | |
364 sps->crop_bottom= get_ue_golomb(&s->gb); | |
365 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
|
366 av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n"); |
1371 | 367 } |
7844
d35a71a3db5f
Fix incorrect printing of brainfart cropping error in some cases in progressive mode.
darkshikari
parents:
7831
diff
changeset
|
368 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
|
369 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
|
370 } |
1371 | 371 }else{ |
2967 | 372 sps->crop_left = |
373 sps->crop_right = | |
374 sps->crop_top = | |
1371 | 375 sps->crop_bottom= 0; |
376 } | |
377 | |
1168 | 378 sps->vui_parameters_present_flag= get_bits1(&s->gb); |
379 if( sps->vui_parameters_present_flag ) | |
9911
14edbbff0f25
H.264: Check the return value of decode_vui_parameters()
astrange
parents:
9910
diff
changeset
|
380 if (decode_vui_parameters(h, sps) < 0) |
14edbbff0f25
H.264: Check the return value of decode_vui_parameters()
astrange
parents:
9910
diff
changeset
|
381 goto fail; |
2967 | 382 |
1168 | 383 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
9163 | 384 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 | 385 sps_id, sps->profile_idc, sps->level_idc, |
386 sps->poc_type, | |
387 sps->ref_frame_count, | |
388 sps->mb_width, sps->mb_height, | |
389 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"), | |
390 sps->direct_8x8_inference_flag ? "8B8" : "", | |
2967 | 391 sps->crop_left, sps->crop_right, |
392 sps->crop_top, sps->crop_bottom, | |
7407 | 393 sps->vui_parameters_present_flag ? "VUI" : "", |
9163 | 394 ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc], |
395 sps->timing_info_present_flag ? sps->num_units_in_tick : 0, | |
396 sps->timing_info_present_flag ? sps->time_scale : 0 | |
1168 | 397 ); |
398 } | |
8688
5cf9f2f663b0
cosmetics: Add empty line for consistent formatting.
diego
parents:
8646
diff
changeset
|
399 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
400 av_free(h->sps_buffers[sps_id]); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
401 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
|
402 h->sps = *sps; |
1168 | 403 return 0; |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
404 fail: |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
405 av_free(sps); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
406 return -1; |
1168 | 407 } |
408 | |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
409 static void |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
410 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
|
411 { |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
412 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
|
413 for(i = 0; i < 52; i++) |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
414 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
|
415 } |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
416 |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
417 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){ |
1168 | 418 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
|
419 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
|
420 PPS *pps; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
421 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
422 if(pps_id >= MAX_PPS_COUNT) { |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
423 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
|
424 return -1; |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
425 } |
2967 | 426 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
427 pps= av_mallocz(sizeof(PPS)); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
428 if(pps == NULL) |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
429 return -1; |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
430 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
|
431 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
|
432 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
|
433 goto fail; |
61b5b99f3b77
Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents:
8234
diff
changeset
|
434 } |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
435 |
1168 | 436 pps->cabac= get_bits1(&s->gb); |
437 pps->pic_order_present= get_bits1(&s->gb); | |
438 pps->slice_group_count= get_ue_golomb(&s->gb) + 1; | |
439 if(pps->slice_group_count > 1 ){ | |
440 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
|
441 av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n"); |
1168 | 442 switch(pps->mb_slice_group_map_type){ |
443 case 0: | |
444 #if 0 | |
445 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | | | |
446 | run_length[ i ] |1 |ue(v) | | |
447 #endif | |
448 break; | |
449 case 2: | |
450 #if 0 | |
451 | for( i = 0; i < num_slice_groups_minus1; i++ ) | | | | |
452 |{ | | | | |
453 | top_left_mb[ i ] |1 |ue(v) | | |
454 | bottom_right_mb[ i ] |1 |ue(v) | | |
455 | } | | | | |
456 #endif | |
457 break; | |
458 case 3: | |
459 case 4: | |
460 case 5: | |
461 #if 0 | |
462 | slice_group_change_direction_flag |1 |u(1) | | |
463 | slice_group_change_rate_minus1 |1 |ue(v) | | |
464 #endif | |
465 break; | |
466 case 6: | |
467 #if 0 | |
468 | slice_group_id_cnt_minus1 |1 |ue(v) | | |
469 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | | | |
470 |) | | | | |
471 | slice_group_id[ i ] |1 |u(v) | | |
472 #endif | |
1214 | 473 break; |
1168 | 474 } |
475 } | |
476 pps->ref_count[0]= get_ue_golomb(&s->gb) + 1; | |
477 pps->ref_count[1]= get_ue_golomb(&s->gb) + 1; | |
4531 | 478 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
|
479 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
|
480 goto fail; |
1168 | 481 } |
2967 | 482 |
1168 | 483 pps->weighted_pred= get_bits1(&s->gb); |
484 pps->weighted_bipred_idc= get_bits(&s->gb, 2); | |
485 pps->init_qp= get_se_golomb(&s->gb) + 26; | |
486 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
|
487 pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb); |
1168 | 488 pps->deblocking_filter_parameters_present= get_bits1(&s->gb); |
489 pps->constrained_intra_pred= get_bits1(&s->gb); | |
490 pps->redundant_pic_cnt_present = get_bits1(&s->gb); | |
2967 | 491 |
3291
454de57e45cf
reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents:
3285
diff
changeset
|
492 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
|
493 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
|
494 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
|
495 memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8)); |
2755 | 496 |
497 if(get_bits_count(&s->gb) < bit_length){ | |
498 pps->transform_8x8_mode= get_bits1(&s->gb); | |
5079 | 499 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
|
500 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
|
501 } else { |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
502 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
|
503 } |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
504 |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
505 build_qp_table(pps, 0, pps->chroma_qp_index_offset[0]); |
7345 | 506 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]); |
507 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
|
508 pps->chroma_qp_diff= 1; |
2967 | 509 |
1168 | 510 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
|
511 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 | 512 pps_id, pps->sps_id, |
513 pps->cabac ? "CABAC" : "CAVLC", | |
514 pps->slice_group_count, | |
515 pps->ref_count[0], pps->ref_count[1], | |
516 pps->weighted_pred ? "weighted" : "", | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
517 pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1], |
1168 | 518 pps->deblocking_filter_parameters_present ? "LPAR" : "", |
519 pps->constrained_intra_pred ? "CONSTR" : "", | |
2755 | 520 pps->redundant_pic_cnt_present ? "REDU" : "", |
521 pps->transform_8x8_mode ? "8x8DCT" : "" | |
1168 | 522 ); |
523 } | |
2967 | 524 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
525 av_free(h->pps_buffers[pps_id]); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
526 h->pps_buffers[pps_id]= pps; |
1168 | 527 return 0; |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
528 fail: |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
529 av_free(pps); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
530 return -1; |
1168 | 531 } |