FFmpeg
hevc_refs.c
Go to the documentation of this file.
1 /*
2  * HEVC video decoder
3  *
4  * Copyright (C) 2012 - 2013 Guillaume Martres
5  * Copyright (C) 2012 - 2013 Gildas Cocherel
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "libavutil/mem.h"
25 
26 #include "decode.h"
27 #include "hevc.h"
28 #include "hevcdec.h"
29 #include "refstruct.h"
30 #include "threadframe.h"
31 
33 {
34  /* frame->frame can be NULL if context init failed */
35  if (!frame->frame || !frame->frame->buf[0])
36  return;
37 
38  frame->flags &= ~flags;
39  if (!frame->flags) {
41  av_frame_unref(frame->frame_grain);
42  frame->needs_fg = 0;
43 
44  ff_refstruct_unref(&frame->tab_mvf);
45 
47  frame->nb_rpl_elems = 0;
48  ff_refstruct_unref(&frame->rpl_tab);
49  frame->refPicList = NULL;
50 
51  ff_refstruct_unref(&frame->hwaccel_picture_private);
52  }
53 }
54 
56  const HEVCFrame *ref, int x0, int y0)
57 {
58  int x_cb = x0 >> s->ps.sps->log2_ctb_size;
59  int y_cb = y0 >> s->ps.sps->log2_ctb_size;
60  int pic_width_cb = s->ps.sps->ctb_width;
61  int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[y_cb * pic_width_cb + x_cb];
62  return &ref->rpl_tab[ctb_addr_ts]->refPicList[0];
63 }
64 
66 {
67  int i;
68  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++)
69  ff_hevc_unref_frame(&s->DPB[i],
72 }
73 
75 {
76  int i;
77  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++)
78  ff_hevc_unref_frame(&s->DPB[i], ~0);
79 }
80 
82 {
83  int i, j, ret;
84  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
85  HEVCFrame *frame = &s->DPB[i];
86  if (frame->frame->buf[0])
87  continue;
88 
89  ret = ff_thread_get_ext_buffer(s->avctx, &frame->tf,
91  if (ret < 0)
92  return NULL;
93 
94  frame->rpl = ff_refstruct_allocz(s->pkt.nb_nals * sizeof(*frame->rpl));
95  if (!frame->rpl)
96  goto fail;
97  frame->nb_rpl_elems = s->pkt.nb_nals;
98 
99  frame->tab_mvf = ff_refstruct_pool_get(s->tab_mvf_pool);
100  if (!frame->tab_mvf)
101  goto fail;
102 
103  frame->rpl_tab = ff_refstruct_pool_get(s->rpl_tab_pool);
104  if (!frame->rpl_tab)
105  goto fail;
106  frame->ctb_count = s->ps.sps->ctb_width * s->ps.sps->ctb_height;
107  for (j = 0; j < frame->ctb_count; j++)
108  frame->rpl_tab[j] = frame->rpl;
109 
110  if (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD)
111  frame->frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST;
112  if ((s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD) ||
113  (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_BOTTOM_FIELD))
114  frame->frame->flags |= AV_FRAME_FLAG_INTERLACED;
115 
116  ret = ff_hwaccel_frame_priv_alloc(s->avctx, &frame->hwaccel_picture_private);
117  if (ret < 0)
118  goto fail;
119 
120  return frame;
121 fail:
123  return NULL;
124  }
125  av_log(s->avctx, AV_LOG_ERROR, "Error allocating frame, DPB full.\n");
126  return NULL;
127 }
128 
130 {
131  HEVCFrame *ref;
132  int i;
133 
134  /* check that this POC doesn't already exist */
135  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
136  HEVCFrame *frame = &s->DPB[i];
137 
138  if (frame->frame->buf[0] && frame->sequence == s->seq_decode &&
139  frame->poc == poc) {
140  av_log(s->avctx, AV_LOG_ERROR, "Duplicate POC in a sequence: %d.\n",
141  poc);
142  return AVERROR_INVALIDDATA;
143  }
144  }
145 
146  ref = alloc_frame(s);
147  if (!ref)
148  return AVERROR(ENOMEM);
149 
150  *frame = ref->frame;
151  s->ref = ref;
152  s->collocated_ref = NULL;
153 
154  if (s->sh.pic_output_flag)
156  else
158 
159  ref->poc = poc;
160  ref->sequence = s->seq_decode;
161  ref->frame->crop_left = s->ps.sps->output_window.left_offset;
162  ref->frame->crop_right = s->ps.sps->output_window.right_offset;
163  ref->frame->crop_top = s->ps.sps->output_window.top_offset;
164  ref->frame->crop_bottom = s->ps.sps->output_window.bottom_offset;
165 
166  return 0;
167 }
168 
170 {
171  for (int i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
172  HEVCFrame *frame = &s->DPB[i];
173  if (frame->sequence == HEVC_SEQUENCE_COUNTER_INVALID) {
175  }
176  }
177 }
178 
180 {
181  if (IS_IRAP(s) && s->no_rasl_output_flag == 1) {
183  for (int i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
184  HEVCFrame *frame = &s->DPB[i];
185  if ((frame->flags & mask) == HEVC_FRAME_FLAG_OUTPUT &&
186  frame->sequence != s->seq_decode) {
187  if (s->sh.no_output_of_prior_pics_flag == 1)
189  else
190  frame->flags |= HEVC_FRAME_FLAG_BUMPING;
191  }
192  }
193  }
194  do {
195  int nb_output = 0;
196  int min_poc = INT_MAX;
197  int i, min_idx, ret;
198 
199  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
200  HEVCFrame *frame = &s->DPB[i];
201  if ((frame->flags & HEVC_FRAME_FLAG_OUTPUT) &&
202  frame->sequence == s->seq_output) {
203  nb_output++;
204  if (frame->poc < min_poc || nb_output == 1) {
205  min_poc = frame->poc;
206  min_idx = i;
207  }
208  }
209  }
210 
211  /* wait for more frames before output */
212  if (!flush && s->seq_output == s->seq_decode && s->ps.sps &&
213  nb_output <= s->ps.sps->temporal_layer[s->ps.sps->max_sub_layers - 1].num_reorder_pics)
214  return 0;
215 
216  if (nb_output) {
217  HEVCFrame *frame = &s->DPB[min_idx];
218 
219  ret = av_frame_ref(out, frame->needs_fg ? frame->frame_grain : frame->frame);
220  if (frame->flags & HEVC_FRAME_FLAG_BUMPING)
222  else
224  if (ret < 0)
225  return ret;
226 
227  if (frame->needs_fg && (ret = av_frame_copy_props(out, frame->frame)) < 0)
228  return ret;
229 
230  if (!(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN))
232 
233  av_log(s->avctx, AV_LOG_DEBUG,
234  "Output frame with POC %d.\n", frame->poc);
235  return 1;
236  }
237 
238  if (s->seq_output != s->seq_decode)
239  s->seq_output = (s->seq_output + 1) & HEVC_SEQUENCE_COUNTER_MASK;
240  else
241  break;
242  } while (1);
243 
244  return 0;
245 }
246 
248 {
249  int dpb = 0;
250  int min_poc = INT_MAX;
251  int i;
252 
253  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
254  HEVCFrame *frame = &s->DPB[i];
255  if ((frame->flags) &&
256  frame->sequence == s->seq_output &&
257  frame->poc != s->poc) {
258  dpb++;
259  }
260  }
261 
262  if (s->ps.sps && dpb >= s->ps.sps->temporal_layer[s->ps.sps->max_sub_layers - 1].max_dec_pic_buffering) {
263  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
264  HEVCFrame *frame = &s->DPB[i];
265  if ((frame->flags) &&
266  frame->sequence == s->seq_output &&
267  frame->poc != s->poc) {
268  if (frame->flags == HEVC_FRAME_FLAG_OUTPUT && frame->poc < min_poc) {
269  min_poc = frame->poc;
270  }
271  }
272  }
273 
274  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
275  HEVCFrame *frame = &s->DPB[i];
276  if (frame->flags & HEVC_FRAME_FLAG_OUTPUT &&
277  frame->sequence == s->seq_output &&
278  frame->poc <= min_poc) {
279  frame->flags |= HEVC_FRAME_FLAG_BUMPING;
280  }
281  }
282 
283  dpb--;
284  }
285 }
286 
288 {
289  HEVCFrame *frame = s->ref;
290  int ctb_count = frame->ctb_count;
291  int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr];
292  int i;
293 
294  if (s->slice_idx >= frame->nb_rpl_elems)
295  return AVERROR_INVALIDDATA;
296 
297  for (i = ctb_addr_ts; i < ctb_count; i++)
298  frame->rpl_tab[i] = frame->rpl + s->slice_idx;
299 
300  frame->refPicList = (RefPicList *)frame->rpl_tab[ctb_addr_ts];
301 
302  return 0;
303 }
304 
306 {
307  SliceHeader *sh = &s->sh;
308 
309  uint8_t nb_list = sh->slice_type == HEVC_SLICE_B ? 2 : 1;
310  uint8_t list_idx;
311  int i, j, ret;
312 
313  ret = init_slice_rpl(s);
314  if (ret < 0)
315  return ret;
316 
317  if (!(s->rps[ST_CURR_BEF].nb_refs + s->rps[ST_CURR_AFT].nb_refs +
318  s->rps[LT_CURR].nb_refs) && !s->ps.pps->pps_curr_pic_ref_enabled_flag) {
319  av_log(s->avctx, AV_LOG_ERROR, "Zero refs in the frame RPS.\n");
320  return AVERROR_INVALIDDATA;
321  }
322 
323  for (list_idx = 0; list_idx < nb_list; list_idx++) {
324  RefPicList rpl_tmp = { { 0 } };
325  RefPicList *rpl = &s->ref->refPicList[list_idx];
326 
327  /* The order of the elements is
328  * ST_CURR_BEF - ST_CURR_AFT - LT_CURR for the L0 and
329  * ST_CURR_AFT - ST_CURR_BEF - LT_CURR for the L1 */
330  int cand_lists[3] = { list_idx ? ST_CURR_AFT : ST_CURR_BEF,
331  list_idx ? ST_CURR_BEF : ST_CURR_AFT,
332  LT_CURR };
333 
334  /* concatenate the candidate lists for the current frame */
335  while (rpl_tmp.nb_refs < sh->nb_refs[list_idx]) {
336  for (i = 0; i < FF_ARRAY_ELEMS(cand_lists); i++) {
337  RefPicList *rps = &s->rps[cand_lists[i]];
338  for (j = 0; j < rps->nb_refs && rpl_tmp.nb_refs < HEVC_MAX_REFS; j++) {
339  rpl_tmp.list[rpl_tmp.nb_refs] = rps->list[j];
340  rpl_tmp.ref[rpl_tmp.nb_refs] = rps->ref[j];
341  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = i == 2;
342  rpl_tmp.nb_refs++;
343  }
344  }
345  // Construct RefPicList0, RefPicList1 (8-8, 8-10)
346  if (s->ps.pps->pps_curr_pic_ref_enabled_flag && rpl_tmp.nb_refs < HEVC_MAX_REFS) {
347  rpl_tmp.list[rpl_tmp.nb_refs] = s->ref->poc;
348  rpl_tmp.ref[rpl_tmp.nb_refs] = s->ref;
349  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = 1;
350  rpl_tmp.nb_refs++;
351  }
352  }
353 
354  /* reorder the references if necessary */
355  if (sh->rpl_modification_flag[list_idx]) {
356  for (i = 0; i < sh->nb_refs[list_idx]; i++) {
357  int idx = sh->list_entry_lx[list_idx][i];
358 
359  if (idx >= rpl_tmp.nb_refs) {
360  av_log(s->avctx, AV_LOG_ERROR, "Invalid reference index.\n");
361  return AVERROR_INVALIDDATA;
362  }
363 
364  rpl->list[i] = rpl_tmp.list[idx];
365  rpl->ref[i] = rpl_tmp.ref[idx];
366  rpl->isLongTerm[i] = rpl_tmp.isLongTerm[idx];
367  rpl->nb_refs++;
368  }
369  } else {
370  memcpy(rpl, &rpl_tmp, sizeof(*rpl));
371  rpl->nb_refs = FFMIN(rpl->nb_refs, sh->nb_refs[list_idx]);
372  }
373 
374  // 8-9
375  if (s->ps.pps->pps_curr_pic_ref_enabled_flag &&
376  !sh->rpl_modification_flag[list_idx] &&
377  rpl_tmp.nb_refs > sh->nb_refs[L0]) {
378  rpl->list[sh->nb_refs[L0] - 1] = s->ref->poc;
379  rpl->ref[sh->nb_refs[L0] - 1] = s->ref;
380  }
381 
382  if (sh->collocated_list == list_idx &&
383  sh->collocated_ref_idx < rpl->nb_refs)
384  s->collocated_ref = rpl->ref[sh->collocated_ref_idx];
385  }
386 
387  return 0;
388 }
389 
390 static HEVCFrame *find_ref_idx(HEVCContext *s, int poc, uint8_t use_msb)
391 {
392  int mask = use_msb ? ~0 : (1 << s->ps.sps->log2_max_poc_lsb) - 1;
393  int i;
394 
395  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
396  HEVCFrame *ref = &s->DPB[i];
397  if (ref->frame->buf[0] && ref->sequence == s->seq_decode) {
398  if ((ref->poc & mask) == poc && (use_msb || ref->poc != s->poc))
399  return ref;
400  }
401  }
402 
403  if (s->nal_unit_type != HEVC_NAL_CRA_NUT && !IS_BLA(s))
404  av_log(s->avctx, AV_LOG_ERROR,
405  "Could not find ref with POC %d\n", poc);
406  return NULL;
407 }
408 
409 static void mark_ref(HEVCFrame *frame, int flag)
410 {
412  frame->flags |= flag;
413 }
414 
416 {
417  HEVCFrame *frame;
418  int i, y;
419 
420  frame = alloc_frame(s);
421  if (!frame)
422  return NULL;
423 
424  if (!s->avctx->hwaccel) {
425  if (!s->ps.sps->pixel_shift) {
426  for (i = 0; frame->frame->data[i]; i++)
427  memset(frame->frame->data[i], 1 << (s->ps.sps->bit_depth - 1),
428  frame->frame->linesize[i] * AV_CEIL_RSHIFT(s->ps.sps->height, s->ps.sps->vshift[i]));
429  } else {
430  for (i = 0; frame->frame->data[i]; i++)
431  for (y = 0; y < (s->ps.sps->height >> s->ps.sps->vshift[i]); y++) {
432  uint8_t *dst = frame->frame->data[i] + y * frame->frame->linesize[i];
433  AV_WN16(dst, 1 << (s->ps.sps->bit_depth - 1));
434  av_memcpy_backptr(dst + 2, 2, 2*(s->ps.sps->width >> s->ps.sps->hshift[i]) - 2);
435  }
436  }
437  }
438 
439  frame->poc = poc;
441  frame->flags = 0;
442 
443  if (s->threads_type == FF_THREAD_FRAME)
444  ff_thread_report_progress(&frame->tf, INT_MAX, 0);
445 
446  return frame;
447 }
448 
449 /* add a reference with the given poc to the list and mark it as used in DPB */
451  int poc, int ref_flag, uint8_t use_msb)
452 {
453  HEVCFrame *ref = find_ref_idx(s, poc, use_msb);
454 
455  if (ref == s->ref || list->nb_refs >= HEVC_MAX_REFS)
456  return AVERROR_INVALIDDATA;
457 
458  if (!ref) {
459  ref = generate_missing_ref(s, poc);
460  if (!ref)
461  return AVERROR(ENOMEM);
462  }
463 
464  list->list[list->nb_refs] = ref->poc;
465  list->ref[list->nb_refs] = ref;
466  list->nb_refs++;
467 
468  mark_ref(ref, ref_flag);
469  return 0;
470 }
471 
473 {
474  const ShortTermRPS *short_rps = s->sh.short_term_rps;
475  const LongTermRPS *long_rps = &s->sh.long_term_rps;
476  RefPicList *rps = s->rps;
477  int i, ret = 0;
478 
479  if (!short_rps) {
480  rps[0].nb_refs = rps[1].nb_refs = 0;
481  return 0;
482  }
483 
485 
486  /* clear the reference flags on all frames except the current one */
487  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
488  HEVCFrame *frame = &s->DPB[i];
489 
490  if (frame == s->ref)
491  continue;
492 
493  mark_ref(frame, 0);
494  }
495 
496  for (i = 0; i < NB_RPS_TYPE; i++)
497  rps[i].nb_refs = 0;
498 
499  /* add the short refs */
500  for (i = 0; i < short_rps->num_delta_pocs; i++) {
501  int poc = s->poc + short_rps->delta_poc[i];
502  int list;
503 
504  if (!short_rps->used[i])
505  list = ST_FOLL;
506  else if (i < short_rps->num_negative_pics)
507  list = ST_CURR_BEF;
508  else
509  list = ST_CURR_AFT;
510 
512  if (ret < 0)
513  goto fail;
514  }
515 
516  /* add the long refs */
517  for (i = 0; i < long_rps->nb_refs; i++) {
518  int poc = long_rps->poc[i];
519  int list = long_rps->used[i] ? LT_CURR : LT_FOLL;
520 
522  if (ret < 0)
523  goto fail;
524  }
525 
526 fail:
527  /* release any frames that are now unused */
528  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++)
529  ff_hevc_unref_frame(&s->DPB[i], 0);
530 
531  return ret;
532 }
533 
535 {
536  int ret = 0;
537  int i;
538  const ShortTermRPS *rps = s->sh.short_term_rps;
539  const LongTermRPS *long_rps = &s->sh.long_term_rps;
540 
541  if (rps) {
542  for (i = 0; i < rps->num_negative_pics; i++)
543  ret += !!rps->used[i];
544  for (; i < rps->num_delta_pocs; i++)
545  ret += !!rps->used[i];
546  }
547 
548  if (long_rps) {
549  for (i = 0; i < long_rps->nb_refs; i++)
550  ret += !!long_rps->used[i];
551  }
552 
553  if (s->ps.pps->pps_curr_pic_ref_enabled_flag)
554  ret++;
555 
556  return ret;
557 }
ShortTermRPS::used
uint8_t used[32]
Definition: hevc_ps.h:84
LT_FOLL
@ LT_FOLL
Definition: hevcdec.h:85
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
ff_hevc_get_ref_list
const RefPicList * ff_hevc_get_ref_list(const HEVCContext *s, const HEVCFrame *ref, int x0, int y0)
Definition: hevc_refs.c:55
out
FILE * out
Definition: movenc.c:55
find_ref_idx
static HEVCFrame * find_ref_idx(HEVCContext *s, int poc, uint8_t use_msb)
Definition: hevc_refs.c:390
AV_FRAME_DATA_FILM_GRAIN_PARAMS
@ AV_FRAME_DATA_FILM_GRAIN_PARAMS
Film grain parameters for a frame, described by AVFilmGrainParams.
Definition: frame.h:188
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:374
RefPicList
Definition: hevcdec.h:189
add_candidate_ref
static int add_candidate_ref(HEVCContext *s, RefPicList *list, int poc, int ref_flag, uint8_t use_msb)
Definition: hevc_refs.c:450
AV_FRAME_FLAG_TOP_FIELD_FIRST
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition: frame.h:638
HEVC_FRAME_FLAG_LONG_REF
#define HEVC_FRAME_FLAG_LONG_REF
Definition: hevcdec.h:348
ff_hevc_clear_refs
void ff_hevc_clear_refs(HEVCContext *s)
Mark all frames in DPB as unused for reference.
Definition: hevc_refs.c:65
fail
#define fail()
Definition: checkasm.h:179
mark_ref
static void mark_ref(HEVCFrame *frame, int flag)
Definition: hevc_refs.c:409
ff_hevc_output_frame
int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush)
Find next frame in output order and put a reference to it in frame.
Definition: hevc_refs.c:179
RefPicList::nb_refs
int nb_refs
Definition: hevcdec.h:193
ShortTermRPS::num_delta_pocs
int num_delta_pocs
Definition: hevc_ps.h:79
refstruct.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
HEVC_SEQUENCE_COUNTER_INVALID
#define HEVC_SEQUENCE_COUNTER_INVALID
Definition: hevcdec.h:352
ff_thread_report_progress
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
Definition: pthread_frame.c:573
HEVC_FRAME_FLAG_BUMPING
#define HEVC_FRAME_FLAG_BUMPING
Definition: hevcdec.h:349
mask
static const uint16_t mask[17]
Definition: lzw.c:38
av_memcpy_backptr
void av_memcpy_backptr(uint8_t *dst, int back, int cnt)
Overlapping memcpy() implementation.
Definition: mem.c:447
ff_hwaccel_frame_priv_alloc
int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
Allocate a hwaccel frame private data if the provided avctx uses a hwaccel method that needs it.
Definition: decode.c:1956
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:59
AV_GET_BUFFER_FLAG_REF
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:425
init_slice_rpl
static int init_slice_rpl(HEVCContext *s)
Definition: hevc_refs.c:287
HEVC_MAX_REFS
@ HEVC_MAX_REFS
Definition: hevc.h:119
ff_hevc_set_new_ref
int ff_hevc_set_new_ref(HEVCContext *s, AVFrame **frame, int poc)
Definition: hevc_refs.c:129
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
decode.h
HEVC_FRAME_FLAG_SHORT_REF
#define HEVC_FRAME_FLAG_SHORT_REF
Definition: hevcdec.h:347
ff_hevc_slice_rpl
int ff_hevc_slice_rpl(HEVCContext *s)
Construct the reference picture list(s) for the current slice.
Definition: hevc_refs.c:305
RefPicList::ref
struct HEVCFrame * ref[HEVC_MAX_REFS]
Definition: hevcdec.h:190
SliceHeader::collocated_list
uint8_t collocated_list
Definition: hevcdec.h:238
generate_missing_ref
static HEVCFrame * generate_missing_ref(HEVCContext *s, int poc)
Definition: hevc_refs.c:415
if
if(ret)
Definition: filter_design.txt:179
AV_PICTURE_STRUCTURE_BOTTOM_FIELD
@ AV_PICTURE_STRUCTURE_BOTTOM_FIELD
coded as bottom field
Definition: avcodec.h:2703
threadframe.h
IS_BLA
#define IS_BLA(s)
Definition: hevcdec.h:76
HEVC_SLICE_B
@ HEVC_SLICE_B
Definition: hevc.h:96
NULL
#define NULL
Definition: coverity.c:32
HEVC_SEQUENCE_COUNTER_MASK
#define HEVC_SEQUENCE_COUNTER_MASK
Definition: hevcdec.h:351
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:709
LongTermRPS::poc
int poc[32]
Definition: hevcdec.h:183
AV_PICTURE_STRUCTURE_TOP_FIELD
@ AV_PICTURE_STRUCTURE_TOP_FIELD
coded as top field
Definition: avcodec.h:2702
ff_thread_release_ext_buffer
void ff_thread_release_ext_buffer(ThreadFrame *f)
Unref a ThreadFrame.
Definition: pthread_frame.c:1008
L0
#define L0
Definition: hevcdec.h:57
list
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
Definition: filter_design.txt:25
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts.c:368
LongTermRPS::poc_msb_present
uint8_t poc_msb_present[32]
Definition: hevcdec.h:184
ff_refstruct_allocz
static void * ff_refstruct_allocz(size_t size)
Equivalent to ff_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
HEVC_NAL_CRA_NUT
@ HEVC_NAL_CRA_NUT
Definition: hevc.h:50
SliceHeader::nb_refs
unsigned int nb_refs[2]
Definition: hevcdec.h:230
ff_hevc_frame_rps
int ff_hevc_frame_rps(HEVCContext *s)
Construct the reference picture sets for the current frame.
Definition: hevc_refs.c:472
IS_IRAP
#define IS_IRAP(s)
Definition: hevcdec.h:78
LongTermRPS::used
uint8_t used[32]
Definition: hevcdec.h:185
ST_FOLL
@ ST_FOLL
Definition: hevcdec.h:83
hevcdec.h
av_frame_ref
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition: frame.c:384
RefPicList::isLongTerm
int isLongTerm[HEVC_MAX_REFS]
Definition: hevcdec.h:192
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
SliceHeader::collocated_ref_idx
unsigned int collocated_ref_idx
Definition: hevcdec.h:240
HEVC_FRAME_FLAG_OUTPUT
#define HEVC_FRAME_FLAG_OUTPUT
Definition: hevcdec.h:346
alloc_frame
static HEVCFrame * alloc_frame(HEVCContext *s)
Definition: hevc_refs.c:81
av_frame_remove_side_data
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
Definition: frame.c:1013
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1593
ShortTermRPS::num_negative_pics
unsigned int num_negative_pics
Definition: hevc_ps.h:78
flag
#define flag(name)
Definition: cbs_av1.c:466
SliceHeader
Definition: hevcdec.h:200
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
HEVCFrame
Definition: hevcdec.h:354
unref_missing_refs
static void unref_missing_refs(HEVCContext *s)
Definition: hevc_refs.c:169
ff_hevc_bump_frame
void ff_hevc_bump_frame(HEVCContext *s)
Definition: hevc_refs.c:247
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:606
SliceHeader::list_entry_lx
unsigned int list_entry_lx[2][32]
Definition: hevcdec.h:224
ff_thread_get_ext_buffer
int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around ff_get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:980
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:633
hevc.h
ff_hevc_unref_frame
void ff_hevc_unref_frame(HEVCFrame *frame, int flags)
Definition: hevc_refs.c:32
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
ST_CURR_BEF
@ ST_CURR_BEF
Definition: hevcdec.h:81
ff_hevc_frame_nb_refs
int ff_hevc_frame_nb_refs(const HEVCContext *s)
Get the number of candidate references for the current frame.
Definition: hevc_refs.c:534
LongTermRPS
Definition: hevcdec.h:182
SliceHeader::slice_type
enum HEVCSliceType slice_type
Definition: hevcdec.h:208
ff_hevc_flush_dpb
void ff_hevc_flush_dpb(HEVCContext *s)
Drop all frames currently in DPB.
Definition: hevc_refs.c:74
LT_CURR
@ LT_CURR
Definition: hevcdec.h:84
NB_RPS_TYPE
@ NB_RPS_TYPE
Definition: hevcdec.h:86
HEVCContext
Definition: hevcdec.h:440
SliceHeader::rpl_modification_flag
uint8_t rpl_modification_flag[2]
Definition: hevcdec.h:226
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:112
ShortTermRPS
Definition: hevc_ps.h:72
RefPicList::list
int list[HEVC_MAX_REFS]
Definition: hevcdec.h:191
mem.h
ST_CURR_AFT
@ ST_CURR_AFT
Definition: hevcdec.h:82
LongTermRPS::nb_refs
uint8_t nb_refs
Definition: hevcdec.h:186
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:474
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
ShortTermRPS::delta_poc
int32_t delta_poc[32]
Definition: hevc_ps.h:83
ff_refstruct_unref
void ff_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
AV_CODEC_EXPORT_DATA_FILM_GRAIN
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition: avcodec.h:420
ff_refstruct_pool_get
void * ff_refstruct_pool_get(FFRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition: refstruct.c:297
AV_WN16
#define AV_WN16(p, v)
Definition: intreadwrite.h:370