annotate h264_ps.c @ 11225:5811a86f55f1 libavcodec

Use memset to set the runs partially coded superblocks Much faster for long runs (e.g. nearly uncoded frames), slightly faster for the general case.
author conrad
date Sun, 21 Feb 2010 00:10:47 +0000
parents 68fa9b353337
children 7dd2a45249a9
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 /**
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
23 * @file libavcodec/h264_ps.c
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
8235
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
208 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
209 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
210 return -1;
3afddc65631b check num_reorder_frames for validity
michael
parents: 4388
diff changeset
211 }
2560
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
212 }
bfba825ee300 Set keyframe flag only on IDR-frames (needed for reordering across I-frames).
lorenm
parents: 2553
diff changeset
213
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
214 return 0;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
215 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
216
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
217 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
218 const uint8_t *jvt_list, const uint8_t *fallback_list){
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
219 MpegEncContext * const s = &h->s;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
220 int i, last = 8, next = 8;
8646
8b52ac19a91c remove zigzag_scan8x8, it is the same as ff_zigzag_direct
stefang
parents: 8627
diff changeset
221 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
222 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
223 memcpy(factors, fallback_list, size*sizeof(uint8_t));
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
224 else
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
225 for(i=0;i<size;i++){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
226 if(next)
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
227 next = (last + get_se_golomb(&s->gb)) & 0xff;
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
228 if(!i && !next){ /* matrix not written, we use the preset one */
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
229 memcpy(factors, jvt_list, size*sizeof(uint8_t));
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
230 break;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
231 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
232 last = factors[scan[i]] = next ? next : last;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
233 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
234 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
235
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
236 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
237 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
238 MpegEncContext * const s = &h->s;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
239 int fallback_sps = !is_sps && sps->scaling_matrix_present;
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
240 const uint8_t *fallback[4] = {
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
241 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
242 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
243 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
244 fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1]
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
245 };
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
246 if(get_bits1(&s->gb)){
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
247 sps->scaling_matrix_present |= is_sps;
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
248 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
249 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
250 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
251 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
252 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
253 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
254 if(is_sps || pps->transform_8x8_mode){
3004
a22cf6e46b0e CQM: fix fallback to JVT scaling lists
lorenm
parents: 3003
diff changeset
255 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
256 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
257 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
258 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
259 }
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
260
8996
e65778184ded Make the following H264 functions available to the parser:
cehoyos
parents: 8991
diff changeset
261 int ff_h264_decode_seq_parameter_set(H264Context *h){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
262 MpegEncContext * const s = &h->s;
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
263 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
264 unsigned int sps_id;
4362
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
265 int i;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
266 SPS *sps;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
267
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
268 profile_idc= get_bits(&s->gb, 8);
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
269 get_bits1(&s->gb); //constraint_set0_flag
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
270 get_bits1(&s->gb); //constraint_set1_flag
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
271 get_bits1(&s->gb); //constraint_set2_flag
2312
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
272 get_bits1(&s->gb); //constraint_set3_flag
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
273 get_bits(&s->gb, 4); // reserved
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
274 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
275 sps_id= get_ue_golomb_31(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
276
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
277 if(sps_id >= MAX_SPS_COUNT) {
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
278 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
279 return -1;
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
280 }
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
281 sps= av_mallocz(sizeof(SPS));
5079
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
282 if(sps == NULL)
4362
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
283 return -1;
5079
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
284
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
285 sps->profile_idc= profile_idc;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
286 sps->level_idc= level_idc;
2312
cb958ec6dfee decode intra cabac mb_type cleanup
michael
parents: 2311
diff changeset
287
7892
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
288 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
289 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
290 sps->scaling_matrix_present = 0;
59e42f624d4d Make pps/sps scaling_matrix initialization closer to the spec.
michael
parents: 7888
diff changeset
291
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
292 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
293 sps->chroma_format_idc= get_ue_golomb_31(&s->gb);
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
294 if(sps->chroma_format_idc == 3)
8735
5d7ebbb7e91b Add fields to H264Context and SPS for upcoming VA API support.
cehoyos
parents: 8727
diff changeset
295 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
296 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
297 sps->bit_depth_chroma = get_ue_golomb(&s->gb) + 8;
2763
01ed2c3b8f08 H.264 lossless mode
lorenm
parents: 2762
diff changeset
298 sps->transform_bypass = get_bits1(&s->gb);
2919
71ca5ed04789 decode custom quant matrices.
lorenm
parents: 2898
diff changeset
299 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
300 }else{
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
301 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
302 sps->bit_depth_luma = 8;
59c35482189e Always initialize bit_depth_luma and bit_depth_chroma in the H264
jai_menon
parents: 10811
diff changeset
303 sps->bit_depth_chroma = 8;
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
304 }
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
305
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
306 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
307 sps->poc_type= get_ue_golomb_31(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
308
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
309 if(sps->poc_type == 0){ //FIXME #define
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
310 sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
311 } else if(sps->poc_type == 1){//FIXME #define
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
312 sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
313 sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
314 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
315 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
316
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
317 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
318 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
319 goto fail;
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
320 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
321
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
322 for(i=0; i<sps->poc_cycle_length; i++)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
323 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
324 }else if(sps->poc_type != 2){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1548
diff changeset
325 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
326 goto fail;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
327 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
328
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
329 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
330 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
331 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
332 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
333 }
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
334 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
335 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
336 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
337 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
338 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
339 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
340 goto fail;
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
341 }
2422
18b8b2dcc037 various security fixes and precautionary checks
michael
parents: 2417
diff changeset
342
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
343 sps->frame_mbs_only_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
344 if(!sps->frame_mbs_only_flag)
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
345 sps->mb_aff= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
346 else
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
347 sps->mb_aff= 0;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
348
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
349 sps->direct_8x8_inference_flag= get_bits1(&s->gb);
11089
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
350 if(!sps->frame_mbs_only_flag && !sps->direct_8x8_inference_flag){
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
351 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
352 goto fail;
68fa9b353337 Check direct_8x8_inference_flag.
michael
parents: 11076
diff changeset
353 }
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
354
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
355 #ifndef ALLOW_INTERLACE
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
356 if(sps->mb_aff)
3954
00a12ef7d800 output typo fixes
diego
parents: 3948
diff changeset
357 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
358 #endif
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
359 sps->crop= get_bits1(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
360 if(sps->crop){
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
361 sps->crop_left = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
362 sps->crop_right = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
363 sps->crop_top = get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
364 sps->crop_bottom= get_ue_golomb(&s->gb);
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
365 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
366 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
367 }
7844
d35a71a3db5f Fix incorrect printing of brainfart cropping error in some cases in progressive mode.
darkshikari
parents: 7831
diff changeset
368 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
369 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
370 }
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
371 }else{
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
372 sps->crop_left =
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
373 sps->crop_right =
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
374 sps->crop_top =
1371
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
375 sps->crop_bottom= 0;
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
376 }
a0c0bee12abf bitstream changes to match JM7.2
michaelni
parents: 1341
diff changeset
377
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
378 sps->vui_parameters_present_flag= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
379 if( sps->vui_parameters_present_flag )
9911
14edbbff0f25 H.264: Check the return value of decode_vui_parameters()
astrange
parents: 9910
diff changeset
380 if (decode_vui_parameters(h, sps) < 0)
14edbbff0f25 H.264: Check the return value of decode_vui_parameters()
astrange
parents: 9910
diff changeset
381 goto fail;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
382
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
383 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
9163
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
384 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
385 sps_id, sps->profile_idc, sps->level_idc,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
386 sps->poc_type,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
387 sps->ref_frame_count,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
388 sps->mb_width, sps->mb_height,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
389 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
390 sps->direct_8x8_inference_flag ? "8B8" : "",
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
391 sps->crop_left, sps->crop_right,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
392 sps->crop_top, sps->crop_bottom,
7407
6288bc103b9f chroma_format_idc=0 aka grayscale support.
michael
parents: 7405
diff changeset
393 sps->vui_parameters_present_flag ? "VUI" : "",
9163
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
394 ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc],
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
395 sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
bc064231dc43 Print timing_info on -debug 1.
michael
parents: 9144
diff changeset
396 sps->timing_info_present_flag ? sps->time_scale : 0
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
397 );
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
398 }
8688
5cf9f2f663b0 cosmetics: Add empty line for consistent formatting.
diego
parents: 8646
diff changeset
399
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
400 av_free(h->sps_buffers[sps_id]);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
401 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
402 h->sps = *sps;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
403 return 0;
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
404 fail:
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
405 av_free(sps);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
406 return -1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
407 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
408
5226
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
409 static void
5231
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
410 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
411 {
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
412 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
413 for(i = 0; i < 52; i++)
10859
762e6bb0ba40 Split (picture|seq) parameter set decoding out of h264.c.
michael
parents: 10858
diff changeset
414 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
415 }
65bffcc5571a Precompute a chroma_qp table with index offset for each pps,
gpoirier
parents: 5225
diff changeset
416
8996
e65778184ded Make the following H264 functions available to the parser:
cehoyos
parents: 8991
diff changeset
417 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
418 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
419 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
420 PPS *pps;
0271b214458b harden h264 decoding to prevent some crashes when input data is corrupted.
gpoirier
parents: 4354
diff changeset
421
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
422 if(pps_id >= MAX_PPS_COUNT) {
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
423 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
424 return -1;
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
425 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
426
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
427 pps= av_mallocz(sizeof(PPS));
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
428 if(pps == NULL)
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
429 return -1;
8451
384600e3fe5b Use get_ue_golomb_31() where possible, almost all are just in headers
michael
parents: 8448
diff changeset
430 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
431 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
432 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
433 goto fail;
61b5b99f3b77 Get rid of now unneeded pps/sps correctness code as pps/sps will not
michael
parents: 8234
diff changeset
434 }
4365
9cebff821565 checking bitstream values and other related changes
michael
parents: 4364
diff changeset
435
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
436 pps->cabac= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
437 pps->pic_order_present= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
438 pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
439 if(pps->slice_group_count > 1 ){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
440 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
441 av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n");
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
442 switch(pps->mb_slice_group_map_type){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
443 case 0:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
444 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
445 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
446 | run_length[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
447 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
448 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
449 case 2:
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 |{ | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
453 | top_left_mb[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
454 | bottom_right_mb[ i ] |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
455 | } | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
456 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
457 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
458 case 3:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
459 case 4:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
460 case 5:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
461 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
462 | slice_group_change_direction_flag |1 |u(1) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
463 | slice_group_change_rate_minus1 |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
464 #endif
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
465 break;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
466 case 6:
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
467 #if 0
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
468 | slice_group_id_cnt_minus1 |1 |ue(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
469 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
470 |) | | |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
471 | slice_group_id[ i ] |1 |u(v) |
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
472 #endif
1214
327c5a36dfe7 fixing mixed dr1 + internal buffers
michaelni
parents: 1187
diff changeset
473 break;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
474 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
475 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
476 pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
477 pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
4531
8a5a3dd25390 fix ref_count check
michael
parents: 4530
diff changeset
478 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
479 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
480 goto fail;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
481 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
482
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
483 pps->weighted_pred= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
484 pps->weighted_bipred_idc= get_bits(&s->gb, 2);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
485 pps->init_qp= get_se_golomb(&s->gb) + 26;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
486 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
487 pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
488 pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
489 pps->constrained_intra_pred= get_bits1(&s->gb);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
490 pps->redundant_pic_cnt_present = get_bits1(&s->gb);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
491
3291
454de57e45cf reinit quant matrices if pps is overwritten by another of the same pps_id.
lorenm
parents: 3285
diff changeset
492 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
493 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
494 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
495 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
496
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
497 if(get_bits_count(&s->gb) < bit_length){
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
498 pps->transform_8x8_mode= get_bits1(&s->gb);
5079
4ff805f87391 allocate PPS and SPS dynamically
benoit
parents: 5066
diff changeset
499 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
500 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
501 } else {
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
502 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
503 }
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
504
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
505 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
506 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]);
a36996f67748 Deobfusate chroma_qp_table[1] init code.
michael
parents: 7344
diff changeset
507 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
508 pps->chroma_qp_diff= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
509
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
510 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
511 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
512 pps_id, pps->sps_id,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
513 pps->cabac ? "CABAC" : "CAVLC",
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
514 pps->slice_group_count,
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
515 pps->ref_count[0], pps->ref_count[1],
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
516 pps->weighted_pred ? "weighted" : "",
5231
07a97575d0c4 Add support for streams with different chroma_qp_index_offset
gpoirier
parents: 5226
diff changeset
517 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
518 pps->deblocking_filter_parameters_present ? "LPAR" : "",
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
519 pps->constrained_intra_pred ? "CONSTR" : "",
2755
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
520 pps->redundant_pic_cnt_present ? "REDU" : "",
975074f04b95 decode H.264 with 8x8 transform.
lorenm
parents: 2751
diff changeset
521 pps->transform_8x8_mode ? "8x8DCT" : ""
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
522 );
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
523 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
524
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
525 av_free(h->pps_buffers[pps_id]);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
526 h->pps_buffers[pps_id]= pps;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
527 return 0;
8234
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
528 fail:
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
529 av_free(pps);
4a8f9bbc5e81 Allocate parameter sets sanely instead of using alloc_parameter_set().
michael
parents: 8231
diff changeset
530 return -1;
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
531 }