FFmpeg
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)
35  return AVERROR_INVALIDDATA;
36 
37  pps = ps->pps[slice_pic_parameter_set_id];
38  if(!pps)
39  return AVERROR_INVALIDDATA;
40 
41  sps = ps->sps[pps->pps_seq_parameter_set_id];
42  if(!sps)
43  return AVERROR_INVALIDDATA;
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 
54  if (!sh->single_tile_in_slice_flag) {
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)
63  return AVERROR_INVALIDDATA;
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 
72  sh->slice_type = get_ue_golomb_31(gb);
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
80  sh->mmvd_group_enable_flag = 0;
81 
82  if (sps->sps_alf_flag) {
83  int ChromaArrayType = sps->chroma_format_idc;
84 
86 
87  if (sh->slice_alf_enabled_flag) {
88  sh->slice_alf_luma_aps_id = get_bits(gb, 5);
89  sh->slice_alf_map_flag = get_bits1(gb);
90  sh->slice_alf_chroma_idc = get_bits(gb, 2);
91 
92  if ((ChromaArrayType == 1 || ChromaArrayType == 2) && sh->slice_alf_chroma_idc > 0)
93  sh->slice_alf_chroma_aps_id = get_bits(gb, 5);
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) {
117  sh->slice_alf_chroma_aps_id = get_bits(gb, 5);
119  }
120 
121  if (sliceChroma2AlfEnabledFlag) {
122  sh->slice_alf_chroma2_aps_id = get_bits(gb, 5);
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 }
EVCParserPoc::PicOrderCntVal
int PicOrderCntVal
Definition: evc_parse.h:78
EVC_MAX_TILE_COLUMNS
@ EVC_MAX_TILE_COLUMNS
Definition: evc.h:140
evc_parse.h
EVCParserSliceHeader::single_tile_in_slice_flag
uint8_t single_tile_in_slice_flag
Definition: evc_parse.h:44
EVCParamSets
Definition: evc_ps.h:211
EVC_SLICE_TYPE_B
@ EVC_SLICE_TYPE_B
Definition: evc.h:103
EVC_IDR_NUT
@ EVC_IDR_NUT
Definition: evc.h:35
EVCParamSets::pps
EVCParserPPS * pps[EVC_MAX_PPS_COUNT]
Definition: evc_ps.h:213
golomb.h
exp golomb vlc stuff
EVCParserSliceHeader::slice_alf_luma_aps_id
uint8_t slice_alf_luma_aps_id
Definition: evc_parse.h:56
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
GetBitContext
Definition: get_bits.h:108
EVCParserPoc::DocOffset
int DocOffset
Definition: evc_parse.h:80
EVCParserSliceHeader::no_output_of_prior_pics_flag
uint8_t no_output_of_prior_pics_flag
Definition: evc_parse.h:52
EVCParserSliceHeader::slice_pic_order_cnt_lsb
uint16_t slice_pic_order_cnt_lsb
Definition: evc_parse.h:63
EVC_MAX_TILE_ROWS
@ EVC_MAX_TILE_ROWS
Definition: evc.h:138
ff_evc_parse_slice_header
int ff_evc_parse_slice_header(GetBitContext *gb, EVCParserSliceHeader *sh, const EVCParamSets *ps, enum EVCNALUnitType nalu_type)
Definition: evc_parse.c:24
EVCParserSliceHeader::slice_alf_chroma2_map_flag
uint8_t slice_alf_chroma2_map_flag
Definition: evc_parse.h:62
EVCParserSliceHeader::slice_alf_enabled_flag
uint8_t slice_alf_enabled_flag
Definition: evc_parse.h:54
EVCParserSliceHeader::slice_alf_map_flag
uint8_t slice_alf_map_flag
Definition: evc_parse.h:57
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
EVCParserSliceHeader::last_tile_id
uint8_t last_tile_id
Definition: evc_parse.h:47
EVCParserSliceHeader::slice_type
uint8_t slice_type
Definition: evc_parse.h:51
EVCParserSliceHeader::slice_pic_parameter_set_id
uint8_t slice_pic_parameter_set_id
Definition: evc_parse.h:43
EVCParamSets::sps
EVCParserSPS * sps[EVC_MAX_SPS_COUNT]
Definition: evc_ps.h:212
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
EVC_MAX_PPS_COUNT
@ EVC_MAX_PPS_COUNT
Definition: evc.h:116
EVCParserSliceHeader
Definition: evc_parse.h:42
EVCNALUnitType
EVCNALUnitType
Definition: evc.h:33
EVCParserSliceHeader::slice_alf_chroma_idc
uint8_t slice_alf_chroma_idc
Definition: evc_parse.h:58
EVCParserSliceHeader::arbitrary_slice_flag
uint8_t arbitrary_slice_flag
Definition: evc_parse.h:46
EVCParserSliceHeader::first_tile_id
uint8_t first_tile_id
Definition: evc_parse.h:45
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
EVCParserSliceHeader::num_remaining_tiles_in_slice_minus1
uint32_t num_remaining_tiles_in_slice_minus1
Definition: evc_parse.h:48
EVCParserSliceHeader::slice_alf_chroma_map_flag
uint8_t slice_alf_chroma_map_flag
Definition: evc_parse.h:60
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
get_ue_golomb_31
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition: golomb.h:120
EVCParserSliceHeader::mmvd_group_enable_flag
uint8_t mmvd_group_enable_flag
Definition: evc_parse.h:53
EVCParserPoc::prevPicOrderCntVal
int prevPicOrderCntVal
Definition: evc_parse.h:79
EVCParserSliceHeader::slice_alf_chroma_aps_id
uint8_t slice_alf_chroma_aps_id
Definition: evc_parse.h:59
EVC_SLICE_TYPE_P
@ EVC_SLICE_TYPE_P
Definition: evc.h:104
EVCParserSliceHeader::delta_tile_id_minus1
uint16_t delta_tile_id_minus1[EVC_MAX_TILE_ROWS *EVC_MAX_TILE_COLUMNS]
Definition: evc_parse.h:49
EVCParserSPS
Definition: evc_ps.h:111
EVCParserPPS
Definition: evc_ps.h:185
get_ue_golomb_long
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
EVCParserPoc
Definition: evc_parse.h:77
evc.h
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
int
int
Definition: ffmpeg_filter.c:424
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
EVCParserSliceHeader::slice_alf_chroma2_aps_id
uint8_t slice_alf_chroma2_aps_id
Definition: evc_parse.h:61
ff_evc_derive_poc
int ff_evc_derive_poc(const EVCParamSets *ps, const EVCParserSliceHeader *sh, EVCParserPoc *poc, enum EVCNALUnitType nalu_type, int tid)
Definition: evc_parse.c:140