annotate h264_ps.c @ 12197:fbf4d5b1b664 libavcodec

Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag, FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that have been checked specifically on such CPUs and are actually faster than their MMX counterparts. In addition, use this flag to enable particular VP8 and LPC SSE2 functions that are faster than their MMX counterparts. Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author rbultje
date Mon, 19 Jul 2010 22:38:23 +0000
parents 572bf2d9931e
children 914f484bb476
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 }