FFmpeg
Loading...
Searching...
No Matches
evc_parse.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "golomb.h"
20#include "evc.h"
21#include "evc_parse.h"
22
23// @see ISO_IEC_23094-1 (7.3.2.6 Slice layer RBSP syntax)
25 const EVCParamSets *ps, enum EVCNALUnitType nalu_type)
26{
27 const EVCParserPPS *pps;
28 const EVCParserSPS *sps;
29 int num_tiles_in_slice = 0;
30 unsigned slice_pic_parameter_set_id;
31
32 slice_pic_parameter_set_id = get_ue_golomb_31(gb);
33
34 if (slice_pic_parameter_set_id >= EVC_MAX_PPS_COUNT)
36
37 pps = ps->pps[slice_pic_parameter_set_id];
38 if(!pps)
40
41 sps = ps->sps[pps->pps_seq_parameter_set_id];
42 if(!sps)
44
45 memset(sh, 0, sizeof(*sh));
46 sh->slice_pic_parameter_set_id = slice_pic_parameter_set_id;
47
48 if (!pps->single_tile_in_pic_flag) {
50 sh->first_tile_id = get_bits(gb, pps->tile_id_len_minus1 + 1);
51 } else
53
55 if (pps->arbitrary_slice_present_flag)
57
58 if (!sh->arbitrary_slice_flag)
59 sh->last_tile_id = get_bits(gb, pps->tile_id_len_minus1 + 1);
60 else {
61 unsigned num_remaining_tiles_in_slice_minus1 = get_ue_golomb_long(gb);
62 if (num_remaining_tiles_in_slice_minus1 > EVC_MAX_TILE_ROWS * EVC_MAX_TILE_COLUMNS - 2)
64
65 num_tiles_in_slice = num_remaining_tiles_in_slice_minus1 + 2;
66 sh->num_remaining_tiles_in_slice_minus1 = num_remaining_tiles_in_slice_minus1;
67 for (int i = 0; i < num_tiles_in_slice - 1; ++i)
69 }
70 }
71
73
74 if (nalu_type == EVC_IDR_NUT)
76
77 if (sps->sps_mmvd_flag && ((sh->slice_type == EVC_SLICE_TYPE_B) || (sh->slice_type == EVC_SLICE_TYPE_P)))
79 else
81
82 if (sps->sps_alf_flag) {
83 int ChromaArrayType = sps->chroma_format_idc;
84
86
87 if (sh->slice_alf_enabled_flag) {
90 sh->slice_alf_chroma_idc = get_bits(gb, 2);
91
92 if ((ChromaArrayType == 1 || ChromaArrayType == 2) && sh->slice_alf_chroma_idc > 0)
94 }
95 if (ChromaArrayType == 3) {
96 int sliceChromaAlfEnabledFlag = 0;
97 int sliceChroma2AlfEnabledFlag = 0;
98
99 if (sh->slice_alf_chroma_idc == 1) { // @see ISO_IEC_23094-1 (7.4.5)
100 sliceChromaAlfEnabledFlag = 1;
101 sliceChroma2AlfEnabledFlag = 0;
102 } else if (sh->slice_alf_chroma_idc == 2) {
103 sliceChromaAlfEnabledFlag = 0;
104 sliceChroma2AlfEnabledFlag = 1;
105 } else if (sh->slice_alf_chroma_idc == 3) {
106 sliceChromaAlfEnabledFlag = 1;
107 sliceChroma2AlfEnabledFlag = 1;
108 } else {
109 sliceChromaAlfEnabledFlag = 0;
110 sliceChroma2AlfEnabledFlag = 0;
111 }
112
113 if (!sh->slice_alf_enabled_flag)
114 sh->slice_alf_chroma_idc = get_bits(gb, 2);
115
116 if (sliceChromaAlfEnabledFlag) {
119 }
120
121 if (sliceChroma2AlfEnabledFlag) {
124 }
125 }
126 }
127
128 if (nalu_type != EVC_IDR_NUT) {
129 if (sps->sps_pocs_flag)
130 sh->slice_pic_order_cnt_lsb = get_bits(gb, sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
131 }
132
133 // @note
134 // If necessary, add the missing fields to the EVCParserSliceHeader structure
135 // and then extend parser implementation
136
137 return 0;
138}
139
141 EVCParserPoc *poc, enum EVCNALUnitType nalu_type, int tid)
142{
144 const EVCParserSPS *sps;
145
146 if (!pps)
147 return AVERROR_INVALIDDATA;
148
149 sps = ps->sps[pps->pps_seq_parameter_set_id];
150 if (!sps)
151 return AVERROR_INVALIDDATA;
152
153 if (sps->sps_pocs_flag) {
154 int PicOrderCntMsb = 0;
156
157 if (nalu_type == EVC_IDR_NUT)
158 PicOrderCntMsb = 0;
159 else {
160 int MaxPicOrderCntLsb = 1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4);
161 int prevPicOrderCntLsb = poc->PicOrderCntVal & (MaxPicOrderCntLsb - 1);
162 int prevPicOrderCntMsb = poc->PicOrderCntVal - prevPicOrderCntLsb;
163
164 if ((sh->slice_pic_order_cnt_lsb < prevPicOrderCntLsb) &&
165 ((prevPicOrderCntLsb - sh->slice_pic_order_cnt_lsb) >= (MaxPicOrderCntLsb / 2)))
166 PicOrderCntMsb = prevPicOrderCntMsb + MaxPicOrderCntLsb;
167 else if ((sh->slice_pic_order_cnt_lsb > prevPicOrderCntLsb) &&
168 ((sh->slice_pic_order_cnt_lsb - prevPicOrderCntLsb) > (MaxPicOrderCntLsb / 2)))
169 PicOrderCntMsb = prevPicOrderCntMsb - MaxPicOrderCntLsb;
170 else
171 PicOrderCntMsb = prevPicOrderCntMsb;
172 }
173 poc->PicOrderCntVal = PicOrderCntMsb + sh->slice_pic_order_cnt_lsb;
174 } else {
175 if (nalu_type == EVC_IDR_NUT) {
176 poc->PicOrderCntVal = 0;
177 poc->DocOffset = -1;
178 } else {
179 int SubGopLength = 1 << sps->log2_sub_gop_length;
180
181 if (tid > (SubGopLength > 1 ? 1 + av_log2(SubGopLength - 1) : 0))
182 return AVERROR_INVALIDDATA;
183
184 if (tid == 0) {
185 poc->PicOrderCntVal = poc->prevPicOrderCntVal + SubGopLength;
186 poc->DocOffset = 0;
188 } else {
189 int ExpectedTemporalId;
190 int PocOffset;
191 int prevDocOffset = poc->DocOffset;
192
193 poc->DocOffset = (prevDocOffset + 1) % SubGopLength;
194 if (poc->DocOffset == 0) {
195 poc->prevPicOrderCntVal += SubGopLength;
196 ExpectedTemporalId = 0;
197 } else
198 ExpectedTemporalId = 1 + av_log2(poc->DocOffset);
199
200 while (tid != ExpectedTemporalId) {
201 poc->DocOffset = (poc->DocOffset + 1) % SubGopLength;
202 if (poc->DocOffset == 0)
203 ExpectedTemporalId = 0;
204 else
205 ExpectedTemporalId = 1 + av_log2(poc->DocOffset);
206 }
207 PocOffset = (int)(SubGopLength * ((2.0 * poc->DocOffset + 1) / (1 << tid) - 2));
208 poc->PicOrderCntVal = poc->prevPicOrderCntVal + PocOffset;
209 }
210 }
211 }
212
213 return 0;
214}
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
uint64_t pps
Definition dovi_rpuenc.c:36
int ff_evc_parse_slice_header(GetBitContext *gb, EVCParserSliceHeader *sh, const EVCParamSets *ps, enum EVCNALUnitType nalu_type)
Definition evc_parse.c:24
int ff_evc_derive_poc(const EVCParamSets *ps, const EVCParserSliceHeader *sh, EVCParserPoc *poc, enum EVCNALUnitType nalu_type, int tid)
Definition evc_parse.c:140
EVC decoder/parser shared code.
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
exp golomb vlc stuff
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition golomb.h:120
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
Definition golomb.h:104
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define av_log2
Definition intmath.h:84
EVCNALUnitType
Definition evc.h:33
@ EVC_IDR_NUT
Definition evc.h:35
@ EVC_MAX_TILE_ROWS
Definition evc.h:138
@ EVC_MAX_TILE_COLUMNS
Definition evc.h:140
@ EVC_MAX_PPS_COUNT
Definition evc.h:113
@ EVC_SLICE_TYPE_B
Definition evc.h:103
@ EVC_SLICE_TYPE_P
Definition evc.h:104
EVCParserPPS * pps[EVC_MAX_PPS_COUNT]
Definition evc_ps.h:213
EVCParserSPS * sps[EVC_MAX_SPS_COUNT]
Definition evc_ps.h:212
int PicOrderCntVal
Definition evc_parse.h:78
int prevPicOrderCntVal
Definition evc_parse.h:79
uint8_t slice_alf_luma_aps_id
Definition evc_parse.h:56
uint8_t slice_alf_map_flag
Definition evc_parse.h:57
uint8_t slice_pic_parameter_set_id
Definition evc_parse.h:43
uint8_t slice_alf_enabled_flag
Definition evc_parse.h:54
uint8_t arbitrary_slice_flag
Definition evc_parse.h:46
uint16_t delta_tile_id_minus1[EVC_MAX_TILE_ROWS *EVC_MAX_TILE_COLUMNS]
Definition evc_parse.h:49
uint8_t slice_alf_chroma2_aps_id
Definition evc_parse.h:61
uint8_t slice_alf_chroma_aps_id
Definition evc_parse.h:59
uint8_t single_tile_in_slice_flag
Definition evc_parse.h:44
uint8_t slice_alf_chroma_map_flag
Definition evc_parse.h:60
uint8_t no_output_of_prior_pics_flag
Definition evc_parse.h:52
uint8_t slice_alf_chroma_idc
Definition evc_parse.h:58
uint8_t mmvd_group_enable_flag
Definition evc_parse.h:53
uint16_t slice_pic_order_cnt_lsb
Definition evc_parse.h:63
uint8_t slice_alf_chroma2_map_flag
Definition evc_parse.h:62
uint32_t num_remaining_tiles_in_slice_minus1
Definition evc_parse.h:48