annotate h264_ps.c @ 12478:5942c42c44e5 libavcodec

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