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