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/avassert.h"
25 
26 #include "decode.h"
27 #include "thread.h"
28 #include "hevc.h"
29 #include "hevcdec.h"
30 #include "refstruct.h"
31 #include "threadframe.h"
32 
34 {
35  /* frame->frame can be NULL if context init failed */
36  if (!frame->frame || !frame->frame->buf[0])
37  return;
38 
39  frame->flags &= ~flags;
40  if (!frame->flags) {
42  av_frame_unref(frame->frame_grain);
43  frame->needs_fg = 0;
44 
45  av_buffer_unref(&frame->tab_mvf_buf);
46  frame->tab_mvf = NULL;
47 
49  frame->nb_rpl_elems = 0;
50  av_buffer_unref(&frame->rpl_tab_buf);
51  frame->rpl_tab = NULL;
52  frame->refPicList = NULL;
53 
54  ff_refstruct_unref(&frame->hwaccel_picture_private);
55  }
56 }
57 
59  const HEVCFrame *ref, int x0, int y0)
60 {
61  int x_cb = x0 >> s->ps.sps->log2_ctb_size;
62  int y_cb = y0 >> s->ps.sps->log2_ctb_size;
63  int pic_width_cb = s->ps.sps->ctb_width;
64  int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[y_cb * pic_width_cb + x_cb];
65  return &ref->rpl_tab[ctb_addr_ts]->refPicList[0];
66 }
67 
69 {
70  int i;
71  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++)
72  ff_hevc_unref_frame(&s->DPB[i],
75 }
76 
78 {
79  int i;
80  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++)
81  ff_hevc_unref_frame(&s->DPB[i], ~0);
82 }
83 
85 {
86  int i, j, ret;
87  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
88  HEVCFrame *frame = &s->DPB[i];
89  if (frame->frame->buf[0])
90  continue;
91 
92  ret = ff_thread_get_ext_buffer(s->avctx, &frame->tf,
94  if (ret < 0)
95  return NULL;
96 
97  frame->rpl = ff_refstruct_allocz(s->pkt.nb_nals * sizeof(*frame->rpl));
98  if (!frame->rpl)
99  goto fail;
100  frame->nb_rpl_elems = s->pkt.nb_nals;
101 
102  frame->tab_mvf_buf = av_buffer_pool_get(s->tab_mvf_pool);
103  if (!frame->tab_mvf_buf)
104  goto fail;
105  frame->tab_mvf = (MvField *)frame->tab_mvf_buf->data;
106 
107  frame->rpl_tab_buf = av_buffer_pool_get(s->rpl_tab_pool);
108  if (!frame->rpl_tab_buf)
109  goto fail;
110  frame->rpl_tab = (RefPicListTab **)frame->rpl_tab_buf->data;
111  frame->ctb_count = s->ps.sps->ctb_width * s->ps.sps->ctb_height;
112  for (j = 0; j < frame->ctb_count; j++)
113  frame->rpl_tab[j] = frame->rpl;
114 
115  if (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD)
117  if ((s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD) ||
118  (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_BOTTOM_FIELD))
120 
121  ret = ff_hwaccel_frame_priv_alloc(s->avctx, &frame->hwaccel_picture_private);
122  if (ret < 0)
123  goto fail;
124 
125  return frame;
126 fail:
128  return NULL;
129  }
130  av_log(s->avctx, AV_LOG_ERROR, "Error allocating frame, DPB full.\n");
131  return NULL;
132 }
133 
135 {
136  HEVCFrame *ref;
137  int i;
138 
139  /* check that this POC doesn't already exist */
140  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
141  HEVCFrame *frame = &s->DPB[i];
142 
143  if (frame->frame->buf[0] && frame->sequence == s->seq_decode &&
144  frame->poc == poc) {
145  av_log(s->avctx, AV_LOG_ERROR, "Duplicate POC in a sequence: %d.\n",
146  poc);
147  return AVERROR_INVALIDDATA;
148  }
149  }
150 
151  ref = alloc_frame(s);
152  if (!ref)
153  return AVERROR(ENOMEM);
154 
155  *frame = ref->frame;
156  s->ref = ref;
157  s->collocated_ref = NULL;
158 
159  if (s->sh.pic_output_flag)
161  else
163 
164  ref->poc = poc;
165  ref->sequence = s->seq_decode;
166  ref->frame->crop_left = s->ps.sps->output_window.left_offset;
167  ref->frame->crop_right = s->ps.sps->output_window.right_offset;
168  ref->frame->crop_top = s->ps.sps->output_window.top_offset;
169  ref->frame->crop_bottom = s->ps.sps->output_window.bottom_offset;
170 
171  return 0;
172 }
173 
175 {
176  for (int i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
177  HEVCFrame *frame = &s->DPB[i];
178  if (frame->sequence == HEVC_SEQUENCE_COUNTER_INVALID) {
180  }
181  }
182 }
183 
185 {
186  if (IS_IRAP(s) && s->no_rasl_output_flag == 1) {
188  for (int i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
189  HEVCFrame *frame = &s->DPB[i];
190  if ((frame->flags & mask) == HEVC_FRAME_FLAG_OUTPUT &&
191  frame->sequence != s->seq_decode) {
192  if (s->sh.no_output_of_prior_pics_flag == 1)
194  else
196  }
197  }
198  }
199  do {
200  int nb_output = 0;
201  int min_poc = INT_MAX;
202  int i, min_idx, ret;
203 
204  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
205  HEVCFrame *frame = &s->DPB[i];
207  frame->sequence == s->seq_output) {
208  nb_output++;
209  if (frame->poc < min_poc || nb_output == 1) {
210  min_poc = frame->poc;
211  min_idx = i;
212  }
213  }
214  }
215 
216  /* wait for more frames before output */
217  if (!flush && s->seq_output == s->seq_decode && s->ps.sps &&
218  nb_output <= s->ps.sps->temporal_layer[s->ps.sps->max_sub_layers - 1].num_reorder_pics)
219  return 0;
220 
221  if (nb_output) {
222  HEVCFrame *frame = &s->DPB[min_idx];
223 
224  ret = av_frame_ref(out, frame->needs_fg ? frame->frame_grain : frame->frame);
227  else
229  if (ret < 0)
230  return ret;
231 
232  if (frame->needs_fg && (ret = av_frame_copy_props(out, frame->frame)) < 0)
233  return ret;
234 
235  if (!(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN))
237 
238  av_log(s->avctx, AV_LOG_DEBUG,
239  "Output frame with POC %d.\n", frame->poc);
240  return 1;
241  }
242 
243  if (s->seq_output != s->seq_decode)
244  s->seq_output = (s->seq_output + 1) & HEVC_SEQUENCE_COUNTER_MASK;
245  else
246  break;
247  } while (1);
248 
249  return 0;
250 }
251 
253 {
254  int dpb = 0;
255  int min_poc = INT_MAX;
256  int i;
257 
258  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
259  HEVCFrame *frame = &s->DPB[i];
260  if ((frame->flags) &&
261  frame->sequence == s->seq_output &&
262  frame->poc != s->poc) {
263  dpb++;
264  }
265  }
266 
267  if (s->ps.sps && dpb >= s->ps.sps->temporal_layer[s->ps.sps->max_sub_layers - 1].max_dec_pic_buffering) {
268  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
269  HEVCFrame *frame = &s->DPB[i];
270  if ((frame->flags) &&
271  frame->sequence == s->seq_output &&
272  frame->poc != s->poc) {
273  if (frame->flags == HEVC_FRAME_FLAG_OUTPUT && frame->poc < min_poc) {
274  min_poc = frame->poc;
275  }
276  }
277  }
278 
279  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
280  HEVCFrame *frame = &s->DPB[i];
282  frame->sequence == s->seq_output &&
283  frame->poc <= min_poc) {
285  }
286  }
287 
288  dpb--;
289  }
290 }
291 
293 {
294  HEVCFrame *frame = s->ref;
295  int ctb_count = frame->ctb_count;
296  int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr];
297  int i;
298 
299  if (s->slice_idx >= frame->nb_rpl_elems)
300  return AVERROR_INVALIDDATA;
301 
302  for (i = ctb_addr_ts; i < ctb_count; i++)
303  frame->rpl_tab[i] = frame->rpl + s->slice_idx;
304 
305  frame->refPicList = (RefPicList *)frame->rpl_tab[ctb_addr_ts];
306 
307  return 0;
308 }
309 
311 {
312  SliceHeader *sh = &s->sh;
313 
314  uint8_t nb_list = sh->slice_type == HEVC_SLICE_B ? 2 : 1;
315  uint8_t list_idx;
316  int i, j, ret;
317 
318  ret = init_slice_rpl(s);
319  if (ret < 0)
320  return ret;
321 
322  if (!(s->rps[ST_CURR_BEF].nb_refs + s->rps[ST_CURR_AFT].nb_refs +
323  s->rps[LT_CURR].nb_refs) && !s->ps.pps->pps_curr_pic_ref_enabled_flag) {
324  av_log(s->avctx, AV_LOG_ERROR, "Zero refs in the frame RPS.\n");
325  return AVERROR_INVALIDDATA;
326  }
327 
328  for (list_idx = 0; list_idx < nb_list; list_idx++) {
329  RefPicList rpl_tmp = { { 0 } };
330  RefPicList *rpl = &s->ref->refPicList[list_idx];
331 
332  /* The order of the elements is
333  * ST_CURR_BEF - ST_CURR_AFT - LT_CURR for the L0 and
334  * ST_CURR_AFT - ST_CURR_BEF - LT_CURR for the L1 */
335  int cand_lists[3] = { list_idx ? ST_CURR_AFT : ST_CURR_BEF,
336  list_idx ? ST_CURR_BEF : ST_CURR_AFT,
337  LT_CURR };
338 
339  /* concatenate the candidate lists for the current frame */
340  while (rpl_tmp.nb_refs < sh->nb_refs[list_idx]) {
341  for (i = 0; i < FF_ARRAY_ELEMS(cand_lists); i++) {
342  RefPicList *rps = &s->rps[cand_lists[i]];
343  for (j = 0; j < rps->nb_refs && rpl_tmp.nb_refs < HEVC_MAX_REFS; j++) {
344  rpl_tmp.list[rpl_tmp.nb_refs] = rps->list[j];
345  rpl_tmp.ref[rpl_tmp.nb_refs] = rps->ref[j];
346  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = i == 2;
347  rpl_tmp.nb_refs++;
348  }
349  }
350  // Construct RefPicList0, RefPicList1 (8-8, 8-10)
351  if (s->ps.pps->pps_curr_pic_ref_enabled_flag && rpl_tmp.nb_refs < HEVC_MAX_REFS) {
352  rpl_tmp.list[rpl_tmp.nb_refs] = s->ref->poc;
353  rpl_tmp.ref[rpl_tmp.nb_refs] = s->ref;
354  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = 1;
355  rpl_tmp.nb_refs++;
356  }
357  }
358 
359  /* reorder the references if necessary */
360  if (sh->rpl_modification_flag[list_idx]) {
361  for (i = 0; i < sh->nb_refs[list_idx]; i++) {
362  int idx = sh->list_entry_lx[list_idx][i];
363 
364  if (idx >= rpl_tmp.nb_refs) {
365  av_log(s->avctx, AV_LOG_ERROR, "Invalid reference index.\n");
366  return AVERROR_INVALIDDATA;
367  }
368 
369  rpl->list[i] = rpl_tmp.list[idx];
370  rpl->ref[i] = rpl_tmp.ref[idx];
371  rpl->isLongTerm[i] = rpl_tmp.isLongTerm[idx];
372  rpl->nb_refs++;
373  }
374  } else {
375  memcpy(rpl, &rpl_tmp, sizeof(*rpl));
376  rpl->nb_refs = FFMIN(rpl->nb_refs, sh->nb_refs[list_idx]);
377  }
378 
379  // 8-9
380  if (s->ps.pps->pps_curr_pic_ref_enabled_flag &&
381  !sh->rpl_modification_flag[list_idx] &&
382  rpl_tmp.nb_refs > sh->nb_refs[L0]) {
383  rpl->list[sh->nb_refs[L0] - 1] = s->ref->poc;
384  rpl->ref[sh->nb_refs[L0] - 1] = s->ref;
385  }
386 
387  if (sh->collocated_list == list_idx &&
388  sh->collocated_ref_idx < rpl->nb_refs)
389  s->collocated_ref = rpl->ref[sh->collocated_ref_idx];
390  }
391 
392  return 0;
393 }
394 
395 static HEVCFrame *find_ref_idx(HEVCContext *s, int poc, uint8_t use_msb)
396 {
397  int mask = use_msb ? ~0 : (1 << s->ps.sps->log2_max_poc_lsb) - 1;
398  int i;
399 
400  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
401  HEVCFrame *ref = &s->DPB[i];
402  if (ref->frame->buf[0] && ref->sequence == s->seq_decode) {
403  if ((ref->poc & mask) == poc && (use_msb || ref->poc != s->poc))
404  return ref;
405  }
406  }
407 
408  if (s->nal_unit_type != HEVC_NAL_CRA_NUT && !IS_BLA(s))
409  av_log(s->avctx, AV_LOG_ERROR,
410  "Could not find ref with POC %d\n", poc);
411  return NULL;
412 }
413 
414 static void mark_ref(HEVCFrame *frame, int flag)
415 {
417  frame->flags |= flag;
418 }
419 
421 {
422  HEVCFrame *frame;
423  int i, y;
424 
425  frame = alloc_frame(s);
426  if (!frame)
427  return NULL;
428 
429  if (!s->avctx->hwaccel) {
430  if (!s->ps.sps->pixel_shift) {
431  for (i = 0; frame->frame->data[i]; i++)
432  memset(frame->frame->data[i], 1 << (s->ps.sps->bit_depth - 1),
433  frame->frame->linesize[i] * AV_CEIL_RSHIFT(s->ps.sps->height, s->ps.sps->vshift[i]));
434  } else {
435  for (i = 0; frame->frame->data[i]; i++)
436  for (y = 0; y < (s->ps.sps->height >> s->ps.sps->vshift[i]); y++) {
437  uint8_t *dst = frame->frame->data[i] + y * frame->frame->linesize[i];
438  AV_WN16(dst, 1 << (s->ps.sps->bit_depth - 1));
439  av_memcpy_backptr(dst + 2, 2, 2*(s->ps.sps->width >> s->ps.sps->hshift[i]) - 2);
440  }
441  }
442  }
443 
444  frame->poc = poc;
446  frame->flags = 0;
447 
448  if (s->threads_type == FF_THREAD_FRAME)
449  ff_thread_report_progress(&frame->tf, INT_MAX, 0);
450 
451  return frame;
452 }
453 
454 /* add a reference with the given poc to the list and mark it as used in DPB */
456  int poc, int ref_flag, uint8_t use_msb)
457 {
458  HEVCFrame *ref = find_ref_idx(s, poc, use_msb);
459 
460  if (ref == s->ref || list->nb_refs >= HEVC_MAX_REFS)
461  return AVERROR_INVALIDDATA;
462 
463  if (!ref) {
464  ref = generate_missing_ref(s, poc);
465  if (!ref)
466  return AVERROR(ENOMEM);
467  }
468 
469  list->list[list->nb_refs] = ref->poc;
470  list->ref[list->nb_refs] = ref;
471  list->nb_refs++;
472 
473  mark_ref(ref, ref_flag);
474  return 0;
475 }
476 
478 {
479  const ShortTermRPS *short_rps = s->sh.short_term_rps;
480  const LongTermRPS *long_rps = &s->sh.long_term_rps;
481  RefPicList *rps = s->rps;
482  int i, ret = 0;
483 
484  if (!short_rps) {
485  rps[0].nb_refs = rps[1].nb_refs = 0;
486  return 0;
487  }
488 
490 
491  /* clear the reference flags on all frames except the current one */
492  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
493  HEVCFrame *frame = &s->DPB[i];
494 
495  if (frame == s->ref)
496  continue;
497 
498  mark_ref(frame, 0);
499  }
500 
501  for (i = 0; i < NB_RPS_TYPE; i++)
502  rps[i].nb_refs = 0;
503 
504  /* add the short refs */
505  for (i = 0; i < short_rps->num_delta_pocs; i++) {
506  int poc = s->poc + short_rps->delta_poc[i];
507  int list;
508 
509  if (!short_rps->used[i])
510  list = ST_FOLL;
511  else if (i < short_rps->num_negative_pics)
512  list = ST_CURR_BEF;
513  else
514  list = ST_CURR_AFT;
515 
517  if (ret < 0)
518  goto fail;
519  }
520 
521  /* add the long refs */
522  for (i = 0; i < long_rps->nb_refs; i++) {
523  int poc = long_rps->poc[i];
524  int list = long_rps->used[i] ? LT_CURR : LT_FOLL;
525 
527  if (ret < 0)
528  goto fail;
529  }
530 
531 fail:
532  /* release any frames that are now unused */
533  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++)
534  ff_hevc_unref_frame(&s->DPB[i], 0);
535 
536  return ret;
537 }
538 
540 {
541  int ret = 0;
542  int i;
543  const ShortTermRPS *rps = s->sh.short_term_rps;
544  const LongTermRPS *long_rps = &s->sh.long_term_rps;
545 
546  if (rps) {
547  for (i = 0; i < rps->num_negative_pics; i++)
548  ret += !!rps->used[i];
549  for (; i < rps->num_delta_pocs; i++)
550  ret += !!rps->used[i];
551  }
552 
553  if (long_rps) {
554  for (i = 0; i < long_rps->nb_refs; i++)
555  ret += !!long_rps->used[i];
556  }
557 
558  if (s->ps.pps->pps_curr_pic_ref_enabled_flag)
559  ret++;
560 
561  return ret;
562 }
HEVC_MAX_REFS
@ HEVC_MAX_REFS
Definition: hevc.h:119
ShortTermRPS::used
uint8_t used[32]
Definition: hevc_ps.h:83
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:58
out
FILE * out
Definition: movenc.c:54
find_ref_idx
static HEVCFrame * find_ref_idx(HEVCContext *s, int poc, uint8_t use_msb)
Definition: hevc_refs.c:395
AV_FRAME_DATA_FILM_GRAIN_PARAMS
@ AV_FRAME_DATA_FILM_GRAIN_PARAMS
Film grain parameters for a frame, described by AVFilmGrainParams.
Definition: frame.h:184
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:340
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:649
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:590
RefPicList
Definition: hevcdec.h:241
thread.h
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:361
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:455
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:641
HEVC_FRAME_FLAG_LONG_REF
#define HEVC_FRAME_FLAG_LONG_REF
Definition: hevcdec.h:400
ff_hevc_clear_refs
void ff_hevc_clear_refs(HEVCContext *s)
Mark all frames in DPB as unused for reference.
Definition: hevc_refs.c:68
fail
#define fail()
Definition: checkasm.h:138
mark_ref
static void mark_ref(HEVCFrame *frame, int flag)
Definition: hevc_refs.c:414
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:184
RefPicList::nb_refs
int nb_refs
Definition: hevcdec.h:245
ShortTermRPS::num_delta_pocs
int num_delta_pocs
Definition: hevc_ps.h:78
refstruct.h
avassert.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:404
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:589
HEVC_FRAME_FLAG_BUMPING
#define HEVC_FRAME_FLAG_BUMPING
Definition: hevcdec.h:401
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:445
av_buffer_pool_get
AVBufferRef * av_buffer_pool_get(AVBufferPool *pool)
Allocate a new AVBuffer, reusing an old buffer from the pool when available.
Definition: buffer.c:384
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:1838
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:51
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:421
init_slice_rpl
static int init_slice_rpl(HEVCContext *s)
Definition: hevc_refs.c:292
ff_hevc_set_new_ref
int ff_hevc_set_new_ref(HEVCContext *s, AVFrame **frame, int poc)
Definition: hevc_refs.c:134
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:399
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:310
RefPicList::ref
struct HEVCFrame * ref[HEVC_MAX_REFS]
Definition: hevcdec.h:242
SliceHeader::collocated_list
uint8_t collocated_list
Definition: hevcdec.h:290
generate_missing_ref
static HEVCFrame * generate_missing_ref(HEVCContext *s, int poc)
Definition: hevc_refs.c:420
frame
static AVFrame * frame
Definition: demux_decode.c:54
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:2770
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:403
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:736
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
LongTermRPS::poc
int poc[32]
Definition: hevcdec.h:235
AV_PICTURE_STRUCTURE_TOP_FIELD
@ AV_PICTURE_STRUCTURE_TOP_FIELD
coded as top field
Definition: avcodec.h:2769
ff_thread_release_ext_buffer
void ff_thread_release_ext_buffer(ThreadFrame *f)
Unref a ThreadFrame.
Definition: pthread_frame.c:1012
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
LongTermRPS::poc_msb_present
uint8_t poc_msb_present[32]
Definition: hevcdec.h:236
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
RefPicListTab
Definition: hevcdec.h:248
SliceHeader::nb_refs
unsigned int nb_refs[2]
Definition: hevcdec.h:282
ff_hevc_frame_rps
int ff_hevc_frame_rps(HEVCContext *s)
Construct the reference picture sets for the current frame.
Definition: hevc_refs.c:477
IS_IRAP
#define IS_IRAP(s)
Definition: hevcdec.h:78
LongTermRPS::used
uint8_t used[32]
Definition: hevcdec.h:237
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:361
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
SliceHeader::collocated_ref_idx
unsigned int collocated_ref_idx
Definition: hevcdec.h:292
HEVC_FRAME_FLAG_OUTPUT
#define HEVC_FRAME_FLAG_OUTPUT
Definition: hevcdec.h:398
MvField
Definition: hevcdec.h:352
alloc_frame
static HEVCFrame * alloc_frame(HEVCContext *s)
Definition: hevc_refs.c:84
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:919
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1543
ShortTermRPS::num_negative_pics
unsigned int num_negative_pics
Definition: hevc_ps.h:77
flag
#define flag(name)
Definition: cbs_av1.c:466
SliceHeader
Definition: hevcdec.h:252
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
HEVCFrame
Definition: hevcdec.h:406
unref_missing_refs
static void unref_missing_refs(HEVCContext *s)
Definition: hevc_refs.c:174
RefPicList::list
int list[HEVC_MAX_REFS]
Definition: hevcdec.h:243
ff_hevc_bump_frame
void ff_hevc_bump_frame(HEVCContext *s)
Definition: hevc_refs.c:252
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:622
SliceHeader::list_entry_lx
unsigned int list_entry_lx[2][32]
Definition: hevcdec.h:276
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:984
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:636
hevc.h
ff_hevc_unref_frame
void ff_hevc_unref_frame(HEVCFrame *frame, int flags)
Definition: hevc_refs.c:33
ret
ret
Definition: filter_design.txt:187
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:539
LongTermRPS
Definition: hevcdec.h:234
SliceHeader::slice_type
enum HEVCSliceType slice_type
Definition: hevcdec.h:260
ff_hevc_flush_dpb
void ff_hevc_flush_dpb(HEVCContext *s)
Drop all frames currently in DPB.
Definition: hevc_refs.c:77
LT_CURR
@ LT_CURR
Definition: hevcdec.h:84
NB_RPS_TYPE
@ NB_RPS_TYPE
Definition: hevcdec.h:86
HEVCContext
Definition: hevcdec.h:494
SliceHeader::rpl_modification_flag
uint8_t rpl_modification_flag[2]
Definition: hevcdec.h:278
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:112
ShortTermRPS
Definition: hevc_ps.h:71
flush
void(* flush)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:367
ST_CURR_AFT
@ ST_CURR_AFT
Definition: hevcdec.h:82
LongTermRPS::nb_refs
uint8_t nb_refs
Definition: hevcdec.h:238
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:474
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:385
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:82
RefPicList::isLongTerm
int isLongTerm[HEVC_MAX_REFS]
Definition: hevcdec.h:244
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:116
AV_CODEC_EXPORT_DATA_FILM_GRAIN
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition: avcodec.h:416
AV_WN16
#define AV_WN16(p, v)
Definition: intreadwrite.h:370