Mercurial > libavcodec.hg
annotate h264_ps.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | 572bf2d9931e |
children | 914f484bb476 |
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 /** |
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 | 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 | |
11767
572bf2d9931e
Check for VUI overeading and reset num_reoder_frames.
michael
parents:
11644
diff
changeset
|
208 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
|
209 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
|
210 sps->num_reorder_frames=0; |
572bf2d9931e
Check for VUI overeading and reset num_reoder_frames.
michael
parents:
11644
diff
changeset
|
211 sps->bitstream_restriction_flag= 0; |
572bf2d9931e
Check for VUI overeading and reset num_reoder_frames.
michael
parents:
11644
diff
changeset
|
212 } |
572bf2d9931e
Check for VUI overeading and reset num_reoder_frames.
michael
parents:
11644
diff
changeset
|
213 |
8235
61b5b99f3b77
Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents:
8234
diff
changeset
|
214 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
|
215 av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames); |
4389 | 216 return -1; |
217 } | |
2560
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
218 } |
bfba825ee300
Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents:
2553
diff
changeset
|
219 |
1168 | 220 return 0; |
221 } | |
222 | |
3004 | 223 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size, |
224 const uint8_t *jvt_list, const uint8_t *fallback_list){ | |
2919 | 225 MpegEncContext * const s = &h->s; |
226 int i, last = 8, next = 8; | |
8646
8b52ac19a91c
remove zigzag_scan8x8, it is the same as ff_zigzag_direct
stefang
parents:
8627
diff
changeset
|
227 const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct; |
3004 | 228 if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */ |
229 memcpy(factors, fallback_list, size*sizeof(uint8_t)); | |
2919 | 230 else |
231 for(i=0;i<size;i++){ | |
232 if(next) | |
233 next = (last + get_se_golomb(&s->gb)) & 0xff; | |
3004 | 234 if(!i && !next){ /* matrix not written, we use the preset one */ |
235 memcpy(factors, jvt_list, size*sizeof(uint8_t)); | |
2919 | 236 break; |
237 } | |
238 last = factors[scan[i]] = next ? next : last; | |
239 } | |
240 } | |
241 | |
242 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps, | |
243 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){ | |
244 MpegEncContext * const s = &h->s; | |
245 int fallback_sps = !is_sps && sps->scaling_matrix_present; | |
246 const uint8_t *fallback[4] = { | |
247 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0], | |
248 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1], | |
249 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0], | |
250 fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1] | |
251 }; | |
252 if(get_bits1(&s->gb)){ | |
253 sps->scaling_matrix_present |= is_sps; | |
3004 | 254 decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y |
255 decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr | |
256 decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb | |
257 decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y | |
258 decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr | |
259 decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb | |
2919 | 260 if(is_sps || pps->transform_8x8_mode){ |
3004 | 261 decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y |
262 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]); // Inter, Y | |
2919 | 263 } |
264 } | |
265 } | |
266 | |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
267 int ff_h264_decode_seq_parameter_set(H264Context *h){ |
1168 | 268 MpegEncContext * const s = &h->s; |
1371 | 269 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
|
270 unsigned int sps_id; |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
271 int i; |
1168 | 272 SPS *sps; |
2967 | 273 |
1168 | 274 profile_idc= get_bits(&s->gb, 8); |
1371 | 275 get_bits1(&s->gb); //constraint_set0_flag |
276 get_bits1(&s->gb); //constraint_set1_flag | |
277 get_bits1(&s->gb); //constraint_set2_flag | |
2312 | 278 get_bits1(&s->gb); //constraint_set3_flag |
279 get_bits(&s->gb, 4); // reserved | |
1168 | 280 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
|
281 sps_id= get_ue_golomb_31(&s->gb); |
2967 | 282 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
283 if(sps_id >= MAX_SPS_COUNT) { |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
284 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
|
285 return -1; |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
286 } |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
287 sps= av_mallocz(sizeof(SPS)); |
5079 | 288 if(sps == NULL) |
4362
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
289 return -1; |
5079 | 290 |
1168 | 291 sps->profile_idc= profile_idc; |
292 sps->level_idc= level_idc; | |
2312 | 293 |
7892
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
294 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
|
295 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
|
296 sps->scaling_matrix_present = 0; |
59e42f624d4d
Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents:
7888
diff
changeset
|
297 |
2755 | 298 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
|
299 sps->chroma_format_idc= get_ue_golomb_31(&s->gb); |
7407 | 300 if(sps->chroma_format_idc == 3) |
8735
5d7ebbb7e91b
Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents:
8727
diff
changeset
|
301 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
|
302 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
|
303 sps->bit_depth_chroma = get_ue_golomb(&s->gb) + 8; |
2763 | 304 sps->transform_bypass = get_bits1(&s->gb); |
2919 | 305 decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8); |
7407 | 306 }else{ |
307 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
|
308 sps->bit_depth_luma = 8; |
59c35482189e
Always initialize bit_depth_luma and bit_depth_chroma in the H264
jai_menon
parents:
10811
diff
changeset
|
309 sps->bit_depth_chroma = 8; |
7407 | 310 } |
2755 | 311 |
1168 | 312 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
|
313 sps->poc_type= get_ue_golomb_31(&s->gb); |
2967 | 314 |
1168 | 315 if(sps->poc_type == 0){ //FIXME #define |
316 sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4; | |
317 } else if(sps->poc_type == 1){//FIXME #define | |
318 sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb); | |
319 sps->offset_for_non_ref_pic= get_se_golomb(&s->gb); | |
320 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
|
321 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
|
322 |
61b5b99f3b77
Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents:
8234
diff
changeset
|
323 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
|
324 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
|
325 goto fail; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
326 } |
2967 | 327 |
1168 | 328 for(i=0; i<sps->poc_cycle_length; i++) |
329 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
|
330 }else if(sps->poc_type != 2){ |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1548
diff
changeset
|
331 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
|
332 goto fail; |
1168 | 333 } |
334 | |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 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
|
339 } |
1371 | 340 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
|
341 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
|
342 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
|
343 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
|
344 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
|
345 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
|
346 goto fail; |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
347 } |
2422 | 348 |
1168 | 349 sps->frame_mbs_only_flag= get_bits1(&s->gb); |
350 if(!sps->frame_mbs_only_flag) | |
351 sps->mb_aff= get_bits1(&s->gb); | |
352 else | |
353 sps->mb_aff= 0; | |
354 | |
355 sps->direct_8x8_inference_flag= get_bits1(&s->gb); | |
11089 | 356 if(!sps->frame_mbs_only_flag && !sps->direct_8x8_inference_flag){ |
357 av_log(h->s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n"); | |
358 goto fail; | |
359 } | |
1168 | 360 |
3316 | 361 #ifndef ALLOW_INTERLACE |
362 if(sps->mb_aff) | |
3954 | 363 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n"); |
3316 | 364 #endif |
1371 | 365 sps->crop= get_bits1(&s->gb); |
366 if(sps->crop){ | |
367 sps->crop_left = get_ue_golomb(&s->gb); | |
368 sps->crop_right = get_ue_golomb(&s->gb); | |
369 sps->crop_top = get_ue_golomb(&s->gb); | |
370 sps->crop_bottom= get_ue_golomb(&s->gb); | |
371 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
|
372 av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n"); |
1371 | 373 } |
7844
d35a71a3db5f
Fix incorrect printing of brainfart cropping error in some cases in progressive mode.
darkshikari
parents:
7831
diff
changeset
|
374 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
|
375 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
|
376 } |
1371 | 377 }else{ |
2967 | 378 sps->crop_left = |
379 sps->crop_right = | |
380 sps->crop_top = | |
1371 | 381 sps->crop_bottom= 0; |
382 } | |
383 | |
1168 | 384 sps->vui_parameters_present_flag= get_bits1(&s->gb); |
385 if( sps->vui_parameters_present_flag ) | |
9911
14edbbff0f25
H.264: Check the return value of decode_vui_parameters()
astrange
parents:
9910
diff
changeset
|
386 if (decode_vui_parameters(h, sps) < 0) |
14edbbff0f25
H.264: Check the return value of decode_vui_parameters()
astrange
parents:
9910
diff
changeset
|
387 goto fail; |
2967 | 388 |
1168 | 389 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ |
9163 | 390 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 | 391 sps_id, sps->profile_idc, sps->level_idc, |
392 sps->poc_type, | |
393 sps->ref_frame_count, | |
394 sps->mb_width, sps->mb_height, | |
395 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"), | |
396 sps->direct_8x8_inference_flag ? "8B8" : "", | |
2967 | 397 sps->crop_left, sps->crop_right, |
398 sps->crop_top, sps->crop_bottom, | |
7407 | 399 sps->vui_parameters_present_flag ? "VUI" : "", |
9163 | 400 ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc], |
401 sps->timing_info_present_flag ? sps->num_units_in_tick : 0, | |
402 sps->timing_info_present_flag ? sps->time_scale : 0 | |
1168 | 403 ); |
404 } | |
8688
5cf9f2f663b0
cosmetics: Add empty line for consistent formatting.
diego
parents:
8646
diff
changeset
|
405 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
406 av_free(h->sps_buffers[sps_id]); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
407 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
|
408 h->sps = *sps; |
1168 | 409 return 0; |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
410 fail: |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
411 av_free(sps); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
412 return -1; |
1168 | 413 } |
414 | |
5226
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
415 static void |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
416 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
|
417 { |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
418 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
|
419 for(i = 0; i < 52; i++) |
10859
762e6bb0ba40
Split (picture|seq) parameter set decoding out of h264.c.
michael
parents:
10858
diff
changeset
|
420 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
|
421 } |
65bffcc5571a
Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents:
5225
diff
changeset
|
422 |
8996
e65778184ded
Make the following H264 functions available to the parser:
cehoyos
parents:
8991
diff
changeset
|
423 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){ |
1168 | 424 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
|
425 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
|
426 PPS *pps; |
0271b214458b
harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents:
4354
diff
changeset
|
427 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
428 if(pps_id >= MAX_PPS_COUNT) { |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
429 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
|
430 return -1; |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
431 } |
2967 | 432 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
433 pps= av_mallocz(sizeof(PPS)); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
434 if(pps == NULL) |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
435 return -1; |
8451
384600e3fe5b
Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents:
8448
diff
changeset
|
436 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
|
437 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
|
438 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
|
439 goto fail; |
61b5b99f3b77
Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents:
8234
diff
changeset
|
440 } |
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
441 |
1168 | 442 pps->cabac= get_bits1(&s->gb); |
443 pps->pic_order_present= get_bits1(&s->gb); | |
444 pps->slice_group_count= get_ue_golomb(&s->gb) + 1; | |
445 if(pps->slice_group_count > 1 ){ | |
446 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
|
447 av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n"); |
1168 | 448 switch(pps->mb_slice_group_map_type){ |
449 case 0: | |
450 #if 0 | |
451 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | | | |
452 | run_length[ i ] |1 |ue(v) | | |
453 #endif | |
454 break; | |
455 case 2: | |
456 #if 0 | |
457 | for( i = 0; i < num_slice_groups_minus1; i++ ) | | | | |
458 |{ | | | | |
459 | top_left_mb[ i ] |1 |ue(v) | | |
460 | bottom_right_mb[ i ] |1 |ue(v) | | |
461 | } | | | | |
462 #endif | |
463 break; | |
464 case 3: | |
465 case 4: | |
466 case 5: | |
467 #if 0 | |
468 | slice_group_change_direction_flag |1 |u(1) | | |
469 | slice_group_change_rate_minus1 |1 |ue(v) | | |
470 #endif | |
471 break; | |
472 case 6: | |
473 #if 0 | |
474 | slice_group_id_cnt_minus1 |1 |ue(v) | | |
475 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | | | |
476 |) | | | | |
477 | slice_group_id[ i ] |1 |u(v) | | |
478 #endif | |
1214 | 479 break; |
1168 | 480 } |
481 } | |
482 pps->ref_count[0]= get_ue_golomb(&s->gb) + 1; | |
483 pps->ref_count[1]= get_ue_golomb(&s->gb) + 1; | |
4531 | 484 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
|
485 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
|
486 goto fail; |
1168 | 487 } |
2967 | 488 |
1168 | 489 pps->weighted_pred= get_bits1(&s->gb); |
490 pps->weighted_bipred_idc= get_bits(&s->gb, 2); | |
491 pps->init_qp= get_se_golomb(&s->gb) + 26; | |
492 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
|
493 pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb); |
1168 | 494 pps->deblocking_filter_parameters_present= get_bits1(&s->gb); |
495 pps->constrained_intra_pred= get_bits1(&s->gb); | |
496 pps->redundant_pic_cnt_present = get_bits1(&s->gb); | |
2967 | 497 |
3291
454de57e45cf
reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents:
3285
diff
changeset
|
498 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
|
499 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
|
500 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
|
501 memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8)); |
2755 | 502 |
503 if(get_bits_count(&s->gb) < bit_length){ | |
504 pps->transform_8x8_mode= get_bits1(&s->gb); | |
5079 | 505 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
|
506 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
|
507 } else { |
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
508 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
|
509 } |
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 build_qp_table(pps, 0, pps->chroma_qp_index_offset[0]); |
7345 | 512 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]); |
513 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
|
514 pps->chroma_qp_diff= 1; |
2967 | 515 |
1168 | 516 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
|
517 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 | 518 pps_id, pps->sps_id, |
519 pps->cabac ? "CABAC" : "CAVLC", | |
520 pps->slice_group_count, | |
521 pps->ref_count[0], pps->ref_count[1], | |
522 pps->weighted_pred ? "weighted" : "", | |
5231
07a97575d0c4
Add support for streams with different chroma_qp_index_offset
gpoirier
parents:
5226
diff
changeset
|
523 pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1], |
1168 | 524 pps->deblocking_filter_parameters_present ? "LPAR" : "", |
525 pps->constrained_intra_pred ? "CONSTR" : "", | |
2755 | 526 pps->redundant_pic_cnt_present ? "REDU" : "", |
527 pps->transform_8x8_mode ? "8x8DCT" : "" | |
1168 | 528 ); |
529 } | |
2967 | 530 |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
531 av_free(h->pps_buffers[pps_id]); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
532 h->pps_buffers[pps_id]= pps; |
1168 | 533 return 0; |
8234
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
534 fail: |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
535 av_free(pps); |
4a8f9bbc5e81
Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents:
8231
diff
changeset
|
536 return -1; |
1168 | 537 } |