annotate h264_ps.c @ 12174:57038190cc5f libavcodec

Give x86 r%d registers names, this will simplify implementation of the chroma inner loopfilter, and it also allows us to save one register on x86-64/sse2.
author rbultje
date Fri, 16 Jul 2010 19:38:10 +0000
parents 572bf2d9931e
children 914f484bb476
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
1 /*
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
2 * H.26L/H.264/AVC/JVT/14496-10/... parameter set decoding
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
15 * Lesser General Public License for more details.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
16 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 3029
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
21
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11089
diff changeset
23 * @file
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
24 * H.264 / AVC / MPEG4 part10 parameter set decoding.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
25 * @author Michael Niedermayer <michaelni@gmx.at>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
26 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
27
9012
15a3df8c01fd More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents: 9004
diff changeset
28 #include "internal.h"
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
29 #include "dsputil.h"
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
30 #include "avcodec.h"
4975
9a6a0818e93f split h264.c to move parser in its own file
aurel
parents: 4931
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
33 #include "golomb.h"
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
37 #include <assert.h>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
2eb0e5a2efad left_block intialisation optimisation.
michael
parents: 7421
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
97
8263
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
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
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
102
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
103 if(cpb_count > 32U){
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
104 av_log(h->s.avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
105 return -1;
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
106 }
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
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
a5dce344904a Parse initial_cpb_removal_delay_length.
cehoyos
parents: 8956
diff changeset
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
9757b2f87d83 Store CPB count in the context.
cehoyos
parents: 8967
diff changeset
119 sps->cpb_cnt = cpb_count;
8263
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
123 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
127
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
128 aspect_ratio_info_present_flag= get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
129
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
130 if( aspect_ratio_info_present_flag ) {
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
131 aspect_ratio_idc= get_bits(&s->gb, 8);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
132 if( aspect_ratio_idc == EXTENDED_SAR ) {
1548
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
133 sps->sar.num= get_bits(&s->gb, 16);
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
134 sps->sar.den= get_bits(&s->gb, 16);
8042
e70975d5ff80 uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 7993
diff changeset
135 }else if(aspect_ratio_idc < FF_ARRAY_ELEMS(pixel_aspect)){
1548
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
136 sps->sar= pixel_aspect[aspect_ratio_idc];
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
139 return -1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
140 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
141 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
142 sps->sar.num=
1548
dd544554ed42 AVRational
michael
parents: 1524
diff changeset
143 sps->sar.den= 0;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
144 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
4a95670ed5f1 Fix large timebases.
michael
parents: 10916
diff changeset
179 if(!sps->num_units_in_tick || !sps->time_scale){
10235
14353a40db5e Cosmetics: Fix typo.
cehoyos
parents: 10234
diff changeset
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
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
188 if(decode_hrd_parameters(h, sps) < 0)
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
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
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
192 if(decode_hrd_parameters(h, sps) < 0)
2e8368ea591a Check that cpb_count is within the allowed range.
michael
parents: 8235
diff changeset
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
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
206 get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
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
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
216 return -1;
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
220 return 0;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
221 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
222
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
223 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
224 const uint8_t *jvt_list, const uint8_t *fallback_list){
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
225 MpegEncContext * const s = &h->s;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
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
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
228 if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
229 memcpy(factors, fallback_list, size*sizeof(uint8_t));
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
230 else
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
231 for(i=0;i<size;i++){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
232 if(next)
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
233 next = (last + get_se_golomb(&s->gb)) & 0xff;
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
234 if(!i && !next){ /* matrix not written, we use the preset one */
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
235 memcpy(factors, jvt_list, size*sizeof(uint8_t));
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
236 break;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
237 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
238 last = factors[scan[i]] = next ? next : last;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
239 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
240 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
241
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
242 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
243 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
244 MpegEncContext * const s = &h->s;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
245 int fallback_sps = !is_sps && sps->scaling_matrix_present;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
246 const uint8_t *fallback[4] = {
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
247 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
248 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
249 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
250 fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1]
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
251 };
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
252 if(get_bits1(&s->gb)){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
253 sps->scaling_matrix_present |= is_sps;
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
254 decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
255 decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
256 decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
257 decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
258 decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
259 decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
260 if(is_sps || pps->transform_8x8_mode){
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
261 decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
262 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]); // Inter, Y
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
263 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
264 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
265 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
266
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
268 MpegEncContext * const s = &h->s;
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
272 SPS *sps;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
273
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
274 profile_idc= get_bits(&s->gb, 8);
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
275 get_bits1(&s->gb); //constraint_set0_flag
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
276 get_bits1(&s->gb); //constraint_set1_flag
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
277 get_bits1(&s->gb); //constraint_set2_flag
2312
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
278 get_bits1(&s->gb); //constraint_set3_flag
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
279 get_bits(&s->gb, 4); // reserved
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
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
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
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
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
290
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
291 sps->profile_idc= profile_idc;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
292 sps->level_idc= level_idc;
2312
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
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
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
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
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
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
01ed2c3b8f08 H.264 lossless mode
lorenm
parents: 2762
diff changeset
304 sps->transform_bypass = get_bits1(&s->gb);
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
305 decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
306 }else{
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
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
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
310 }
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
311
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
314
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
315 if(sps->poc_type == 0){ //FIXME #define
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
316 sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
317 } else if(sps->poc_type == 1){//FIXME #define
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
318 sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
319 sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
327
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
328 for(i=0; i<sps->poc_cycle_length; i++)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
333 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
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
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2417
diff changeset
348
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
349 sps->frame_mbs_only_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
350 if(!sps->frame_mbs_only_flag)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
351 sps->mb_aff= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
352 else
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
353 sps->mb_aff= 0;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
354
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
355 sps->direct_8x8_inference_flag= get_bits1(&s->gb);
11089
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
356 if(!sps->frame_mbs_only_flag && !sps->direct_8x8_inference_flag){
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
357 av_log(h->s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n");
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
358 goto fail;
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
359 }
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
360
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
361 #ifndef ALLOW_INTERLACE
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
362 if(sps->mb_aff)
3954
00a12ef7d800 output typo fixes
diego
parents: 3948
diff changeset
363 av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
364 #endif
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
365 sps->crop= get_bits1(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
366 if(sps->crop){
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
367 sps->crop_left = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
368 sps->crop_right = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
369 sps->crop_top = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
370 sps->crop_bottom= get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
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
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
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
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
377 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
378 sps->crop_left =
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
379 sps->crop_right =
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
380 sps->crop_top =
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
381 sps->crop_bottom= 0;
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
382 }
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
383
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
384 sps->vui_parameters_present_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
388
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
389 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
9163
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
391 sps_id, sps->profile_idc, sps->level_idc,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
392 sps->poc_type,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
393 sps->ref_frame_count,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
394 sps->mb_width, sps->mb_height,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
395 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
396 sps->direct_8x8_inference_flag ? "8B8" : "",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
397 sps->crop_left, sps->crop_right,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
398 sps->crop_top, sps->crop_bottom,
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
399 sps->vui_parameters_present_flag ? "VUI" : "",
9163
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
400 ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc],
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
401 sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
402 sps->timing_info_present_flag ? sps->time_scale : 0
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
403 );
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
413 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
442 pps->cabac= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
443 pps->pic_order_present= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
444 pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
445 if(pps->slice_group_count > 1 ){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
448 switch(pps->mb_slice_group_map_type){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
449 case 0:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
450 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
451 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
452 | run_length[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
453 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
454 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
455 case 2:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
456 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
457 | for( i = 0; i < num_slice_groups_minus1; i++ ) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
458 |{ | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
459 | top_left_mb[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
460 | bottom_right_mb[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
461 | } | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
462 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
463 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
464 case 3:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
465 case 4:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
466 case 5:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
467 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
468 | slice_group_change_direction_flag |1 |u(1) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
469 | slice_group_change_rate_minus1 |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
470 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
471 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
472 case 6:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
473 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
474 | slice_group_id_cnt_minus1 |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
475 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
476 |) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
477 | slice_group_id[ i ] |1 |u(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
478 #endif
1214
327c5a36dfe7 fixing mixed dr1 + internal buffers
michaelni
parents: 1187
diff changeset
479 break;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
480 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
481 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
482 pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
483 pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
4531
8a5a3dd25390 fix ref_count check
michael
parents: 4530
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
487 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
488
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
489 pps->weighted_pred= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
490 pps->weighted_bipred_idc= get_bits(&s->gb, 2);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
491 pps->init_qp= get_se_golomb(&s->gb) + 26;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
494 pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
495 pps->constrained_intra_pred= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
496 pps->redundant_pic_cnt_present = get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
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
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
502
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
503 if(get_bits_count(&s->gb) < bit_length){
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
504 pps->transform_8x8_mode= get_bits1(&s->gb);
5079
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
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
a36996f67748 Deobfusate chroma_qp_table[1] init code.
michael
parents: 7344
diff changeset
512 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]);
a36996f67748 Deobfusate chroma_qp_table[1] init code.
michael
parents: 7344
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
515
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
518 pps_id, pps->sps_id,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
519 pps->cabac ? "CABAC" : "CAVLC",
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
520 pps->slice_group_count,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
521 pps->ref_count[0], pps->ref_count[1],
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
524 pps->deblocking_filter_parameters_present ? "LPAR" : "",
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
525 pps->constrained_intra_pred ? "CONSTR" : "",
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
526 pps->redundant_pic_cnt_present ? "REDU" : "",
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
527 pps->transform_8x8_mode ? "8x8DCT" : ""
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
528 );
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
529 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
537 }