FFmpeg
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 
25 #include "libavutil/mem.h"
26 #include "libavutil/stereo3d.h"
27 
28 #include "libavcodec/decode.h"
29 #include "hevc.h"
30 #include "hevcdec.h"
32 #include "libavcodec/thread.h"
33 #include "libavutil/refstruct.h"
34 
36 {
37  frame->flags &= ~flags;
38  if (!(frame->flags & ~HEVC_FRAME_FLAG_CORRUPT))
39  frame->flags = 0;
40  if (!frame->flags) {
42  av_frame_unref(frame->frame_grain);
43  frame->needs_fg = 0;
44 
46  av_refstruct_unref(&frame->tab_mvf);
47 
49  frame->nb_rpl_elems = 0;
50  av_refstruct_unref(&frame->rpl_tab);
51  frame->refPicList = NULL;
52 
53  av_refstruct_unref(&frame->hwaccel_picture_private);
54  }
55 }
56 
57 const RefPicList *ff_hevc_get_ref_list(const HEVCFrame *ref, int x0, int y0)
58 {
59  const HEVCSPS *sps = ref->pps->sps;
60  int x_cb = x0 >> sps->log2_ctb_size;
61  int y_cb = y0 >> sps->log2_ctb_size;
62  int pic_width_cb = sps->ctb_width;
63  int ctb_addr_ts = ref->pps->ctb_addr_rs_to_ts[y_cb * pic_width_cb + x_cb];
64  return &ref->rpl_tab[ctb_addr_ts]->refPicList[0];
65 }
66 
68 {
69  int i;
70  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++)
74 }
75 
77 {
78  for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
79  HEVCLayerContext *l = &s->layers[layer];
80  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++)
81  ff_hevc_unref_frame(&l->DPB[i], ~0);
82  }
83 }
84 
86 {
88  uintptr_t data = (uintptr_t)alpha->data[0];
89  int ret;
90 
91  for (int i = 0; i < FF_ARRAY_ELEMS(alpha->buf) && alpha->buf[i]; i++) {
92  AVBufferRef *buf = alpha->buf[i];
93  uintptr_t buf_begin = (uintptr_t)buf->data;
94 
95  if (data >= buf_begin && data < buf_begin + buf->size) {
96  ret = av_buffer_replace(&alpha->buf[i], base_a);
97  if (ret < 0)
98  return ret;
99 
100  alpha->linesize[0] = base->linesize[3];
101  alpha->data[0] = base->data[3];
102 
103  return 0;
104  }
105  }
106 
107  return AVERROR_BUG;
108 }
109 
111 {
112  const HEVCVPS *vps = l->sps->vps;
113  const int view_id = vps->view_id[s->cur_layer];
114  int i, j, ret;
115  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
116  HEVCFrame *frame = &l->DPB[i];
117  if (frame->f)
118  continue;
119 
120  ret = ff_progress_frame_alloc(s->avctx, &frame->tf);
121  if (ret < 0)
122  return NULL;
123 
124  // Add LCEVC SEI metadata here, as it's needed in get_buffer()
125  if (s->sei.common.itut_t35.lcevc) {
126  ret = ff_frame_new_side_data_from_buf(s->avctx, frame->tf.f,
127  AV_FRAME_DATA_LCEVC, &s->sei.common.itut_t35.lcevc);
128  if (ret < 0)
129  goto fail;
130  }
131 
132  // add view ID side data if it's nontrivial
133  if (!ff_hevc_is_alpha_video(s) && (vps->nb_layers > 1 || view_id)) {
134  HEVCSEITDRDI *tdrdi = &s->sei.tdrdi;
135  AVFrameSideData *sd = av_frame_side_data_new(&frame->f->side_data,
136  &frame->f->nb_side_data,
138  sizeof(int), 0);
139  if (!sd)
140  goto fail;
141  *(int*)sd->data = view_id;
142 
143  if (tdrdi->num_ref_displays) {
144  AVStereo3D *stereo_3d;
145 
146  stereo_3d = av_stereo3d_create_side_data(frame->f);
147  if (!stereo_3d)
148  goto fail;
149 
150  stereo_3d->type = AV_STEREO3D_FRAMESEQUENCE;
151  if (tdrdi->left_view_id[0] == view_id)
152  stereo_3d->view = AV_STEREO3D_VIEW_LEFT;
153  else if (tdrdi->right_view_id[0] == view_id)
154  stereo_3d->view = AV_STEREO3D_VIEW_RIGHT;
155  else
156  stereo_3d->view = AV_STEREO3D_VIEW_UNSPEC;
157  }
158  }
159 
161  if (ret < 0)
162  goto fail;
163 
164  size_t rpl_bytes;
165  if (av_size_mult(s->pkt.nb_nals, sizeof(*frame->rpl), &rpl_bytes) < 0)
166  goto fail;
167  frame->rpl = av_refstruct_allocz(rpl_bytes);
168  if (!frame->rpl)
169  goto fail;
170  frame->nb_rpl_elems = s->pkt.nb_nals;
171 
173  if (!frame->tab_mvf)
174  goto fail;
175 
177  if (!frame->rpl_tab)
178  goto fail;
179  frame->ctb_count = l->sps->ctb_width * l->sps->ctb_height;
180  for (j = 0; j < frame->ctb_count; j++)
181  frame->rpl_tab[j] = frame->rpl;
182 
183  if (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD)
185  if ((s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD) ||
186  (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_BOTTOM_FIELD))
187  frame->f->flags |= AV_FRAME_FLAG_INTERLACED;
188 
189  ret = ff_hwaccel_frame_priv_alloc(s->avctx, &frame->hwaccel_picture_private);
190  if (ret < 0)
191  goto fail;
192 
193  frame->pps = av_refstruct_ref_c(s->pps);
194  if (l != &s->layers[0] && ff_hevc_is_alpha_video(s)) {
195  AVFrame *alpha = frame->f;
196  AVFrame *base = s->layers[0].cur_frame->f;
198  if (ret < 0)
199  goto fail;
200  }
201 
202  return frame;
203 fail:
205  return NULL;
206  }
207  av_log(s->avctx, AV_LOG_ERROR, "Error allocating frame, DPB full.\n");
208  return NULL;
209 }
210 
212 {
213  HEVCFrame *ref;
214  int i;
215  int no_output;
216 
217  /* check that this POC doesn't already exist */
218  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
219  HEVCFrame *frame = &l->DPB[i];
220 
221  if (frame->f && frame->poc == poc) {
222  av_log(s->avctx, AV_LOG_ERROR, "Duplicate POC in a sequence: %d.\n",
223  poc);
224  return AVERROR_INVALIDDATA;
225  }
226  }
227 
228  ref = alloc_frame(s, l);
229  if (!ref)
230  return AVERROR(ENOMEM);
231 
232  s->cur_frame = ref;
233  l->cur_frame = ref;
234  s->collocated_ref = NULL;
235 
236  ref->base_layer_frame = (l != &s->layers[0] && s->layers[0].cur_frame) ?
237  s->layers[0].cur_frame - s->layers[0].DPB : -1;
238 
239  no_output = !IS_IRAP(s) && (s->poc < s->recovery_poc) &&
241  !(s->avctx->flags & AV_CODEC_FLAG_OUTPUT_CORRUPT) &&
242  !(s->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL);
243  if (s->sh.pic_output_flag && !no_output)
245  else
247 
248  ref->poc = poc;
249  ref->f->crop_left = l->sps->output_window.left_offset;
250  ref->f->crop_right = l->sps->output_window.right_offset;
251  ref->f->crop_top = l->sps->output_window.top_offset;
252  ref->f->crop_bottom = l->sps->output_window.bottom_offset;
253 
254  return 0;
255 }
256 
258 {
259  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
260  HEVCFrame *frame = &l->DPB[i];
261  if (frame->flags & HEVC_FRAME_FLAG_UNAVAILABLE) {
263  }
264  }
265 }
266 
268  unsigned layers_active_decode, unsigned layers_active_output,
269  unsigned max_output, unsigned max_dpb, int discard)
270 {
271  while (1) {
272  int nb_dpb[HEVC_VPS_MAX_LAYERS] = { 0 };
273  int nb_output = 0;
274  int min_poc = INT_MAX;
275  int min_layer = -1;
276  int min_idx, ret = 0;
277 
278  for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
279  HEVCLayerContext *l = &s->layers[layer];
280 
281  if (!(layers_active_decode & (1 << layer)))
282  continue;
283 
284  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
285  HEVCFrame *frame = &l->DPB[i];
286  if (frame->flags & HEVC_FRAME_FLAG_OUTPUT) {
287  // nb_output counts AUs with an output-pending frame
288  // in at least one layer
289  if (!(frame->base_layer_frame >= 0 &&
290  (s->layers[0].DPB[frame->base_layer_frame].flags & HEVC_FRAME_FLAG_OUTPUT)))
291  nb_output++;
292  if (min_layer < 0 || frame->poc < min_poc) {
293  min_poc = frame->poc;
294  min_idx = i;
295  min_layer = layer;
296  }
297  }
298  nb_dpb[layer] += !!frame->flags;
299  }
300  }
301 
302  if (nb_output > max_output ||
303  (nb_output &&
304  (nb_dpb[0] > max_dpb || nb_dpb[1] > max_dpb))) {
305  HEVCFrame *frame = &s->layers[min_layer].DPB[min_idx];
306  AVFrame *f = frame->needs_fg ? frame->frame_grain : frame->f;
307  int output = !discard && (layers_active_output & (1 << min_layer));
308 
309  if (output) {
310  if (frame->flags & HEVC_FRAME_FLAG_CORRUPT)
311  f->flags |= AV_FRAME_FLAG_CORRUPT;
312  f->pkt_dts = s->pkt_dts;
314  }
316  if (ret < 0)
317  return ret;
318 
319  av_log(s->avctx, AV_LOG_DEBUG, "%s frame with POC %d/%d.\n",
320  output ? "Output" : "Discarded", min_layer, frame->poc);
321  continue;
322  }
323  return 0;
324  }
325 }
326 
328 {
329  HEVCFrame *frame = s->cur_frame;
330  int ctb_count = frame->ctb_count;
331  int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr];
332  int i;
333 
334  if (s->slice_idx >= frame->nb_rpl_elems)
335  return AVERROR_INVALIDDATA;
336 
337  for (i = ctb_addr_ts; i < ctb_count; i++)
338  frame->rpl_tab[i] = frame->rpl + s->slice_idx;
339 
340  frame->refPicList = (RefPicList *)frame->rpl_tab[ctb_addr_ts];
341 
342  return 0;
343 }
344 
346 {
347  SliceHeader *sh = &s->sh;
348 
349  uint8_t nb_list = sh->slice_type == HEVC_SLICE_B ? 2 : 1;
350  uint8_t list_idx;
351  int i, j, ret;
352 
353  ret = init_slice_rpl(s);
354  if (ret < 0)
355  return ret;
356 
357  if (!(s->rps[ST_CURR_BEF].nb_refs + s->rps[ST_CURR_AFT].nb_refs +
358  s->rps[LT_CURR].nb_refs +
359  s->rps[INTER_LAYER0].nb_refs + s->rps[INTER_LAYER1].nb_refs) &&
360  !s->pps->pps_curr_pic_ref_enabled_flag) {
361  av_log(s->avctx, AV_LOG_ERROR, "Zero refs in the frame RPS.\n");
362  return AVERROR_INVALIDDATA;
363  }
364 
365  for (list_idx = 0; list_idx < nb_list; list_idx++) {
366  RefPicList rpl_tmp = { { 0 } };
367  RefPicList *rpl = &s->cur_frame->refPicList[list_idx];
368 
369  /* The order of the elements is
370  * ST_CURR_BEF - INTER_LAYER0 - ST_CURR_AFT - LT_CURR - INTER_LAYER1 for the L0 and
371  * ST_CURR_AFT - INTER_LAYER1 - ST_CURR_BEF - LT_CURR - INTER_LAYER0 for the L1 */
372  int cand_lists[] = { list_idx ? ST_CURR_AFT : ST_CURR_BEF,
373  list_idx ? INTER_LAYER1 : INTER_LAYER0,
374  list_idx ? ST_CURR_BEF : ST_CURR_AFT,
375  LT_CURR,
376  list_idx ? INTER_LAYER0 : INTER_LAYER1
377  };
378 
379  /* concatenate the candidate lists for the current frame */
380  while (rpl_tmp.nb_refs < sh->nb_refs[list_idx]) {
381  for (i = 0; i < FF_ARRAY_ELEMS(cand_lists); i++) {
382  RefPicList *rps = &s->rps[cand_lists[i]];
383  for (j = 0; j < rps->nb_refs && rpl_tmp.nb_refs < HEVC_MAX_REFS; j++) {
384  rpl_tmp.list[rpl_tmp.nb_refs] = rps->list[j];
385  rpl_tmp.ref[rpl_tmp.nb_refs] = rps->ref[j];
386  // multiview inter-layer refs are treated as long-term here,
387  // cf. G.8.1.3
388  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = cand_lists[i] == LT_CURR ||
389  cand_lists[i] == INTER_LAYER0 ||
390  cand_lists[i] == INTER_LAYER1;
391  rpl_tmp.nb_refs++;
392  }
393  }
394  // Construct RefPicList0, RefPicList1 (8-8, 8-10)
395  if (s->pps->pps_curr_pic_ref_enabled_flag && rpl_tmp.nb_refs < HEVC_MAX_REFS) {
396  rpl_tmp.list[rpl_tmp.nb_refs] = s->cur_frame->poc;
397  rpl_tmp.ref[rpl_tmp.nb_refs] = s->cur_frame;
398  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = 1;
399  rpl_tmp.nb_refs++;
400  }
401  }
402 
403  /* reorder the references if necessary */
404  if (sh->rpl_modification_flag[list_idx]) {
405  for (i = 0; i < sh->nb_refs[list_idx]; i++) {
406  int idx = sh->list_entry_lx[list_idx][i];
407 
408  if (idx >= rpl_tmp.nb_refs) {
409  av_log(s->avctx, AV_LOG_ERROR, "Invalid reference index.\n");
410  return AVERROR_INVALIDDATA;
411  }
412 
413  rpl->list[i] = rpl_tmp.list[idx];
414  rpl->ref[i] = rpl_tmp.ref[idx];
415  rpl->isLongTerm[i] = rpl_tmp.isLongTerm[idx];
416  rpl->nb_refs++;
417  }
418  } else {
419  memcpy(rpl, &rpl_tmp, sizeof(*rpl));
420  rpl->nb_refs = FFMIN(rpl->nb_refs, sh->nb_refs[list_idx]);
421  }
422 
423  // 8-9
424  if (s->pps->pps_curr_pic_ref_enabled_flag &&
425  !sh->rpl_modification_flag[list_idx] &&
426  rpl_tmp.nb_refs > sh->nb_refs[L0]) {
427  rpl->list[sh->nb_refs[L0] - 1] = s->cur_frame->poc;
428  rpl->ref[sh->nb_refs[L0] - 1] = s->cur_frame;
429  }
430 
431  if (sh->collocated_list == list_idx &&
432  sh->collocated_ref_idx < rpl->nb_refs)
433  s->collocated_ref = rpl->ref[sh->collocated_ref_idx];
434  }
435 
436  return 0;
437 }
438 
440  int poc, uint8_t use_msb)
441 {
442  int mask = use_msb ? ~0 : (1 << l->sps->log2_max_poc_lsb) - 1;
443  int i;
444 
445  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
446  HEVCFrame *ref = &l->DPB[i];
447  if (ref->f) {
448  if ((ref->poc & mask) == poc && (use_msb || ref->poc != s->poc))
449  return ref;
450  }
451  }
452 
453  if (s->nal_unit_type != HEVC_NAL_CRA_NUT && !IS_BLA(s))
454  av_log(s->avctx, AV_LOG_ERROR,
455  "Could not find ref with POC %d\n", poc);
456  return NULL;
457 }
458 
459 static void mark_ref(HEVCFrame *frame, int flag)
460 {
462  frame->flags |= flag;
463 }
464 
466 {
467  HEVCFrame *frame;
468 
469  frame = alloc_frame(s, l);
470  if (!frame)
471  return NULL;
472 
473  if (!s->avctx->hwaccel) {
474  int nb_planes = l->sps->chroma_format_idc ? 3 : 1;
475  if (!l->sps->pixel_shift) {
476  for (int i = 0; i < nb_planes; i++)
477  memset(frame->f->data[i], 1 << (l->sps->bit_depth - 1),
478  frame->f->linesize[i] * AV_CEIL_RSHIFT(l->sps->height, l->sps->vshift[i]));
479  } else {
480  for (int i = 0; i < nb_planes; i++)
481  for (int y = 0; y < (l->sps->height >> l->sps->vshift[i]); y++) {
482  uint8_t *dst = frame->f->data[i] + y * frame->f->linesize[i];
483  AV_WN16(dst, 1 << (l->sps->bit_depth - 1));
484  av_memcpy_backptr(dst + 2, 2, 2*(l->sps->width >> l->sps->hshift[i]) - 2);
485  }
486  }
487  }
488 
489  frame->poc = poc;
491 
492  if (s->avctx->active_thread_type == FF_THREAD_FRAME)
493  ff_progress_frame_report(&frame->tf, INT_MAX);
494 
495  return frame;
496 }
497 
498 /* add a reference with the given poc to the list and mark it as used in DPB */
500  RefPicList *list,
501  int poc, int ref_flag, uint8_t use_msb)
502 {
503  HEVCFrame *ref = find_ref_idx(s, l, poc, use_msb);
504 
505  if (ref == s->cur_frame || list->nb_refs >= HEVC_MAX_REFS)
506  return AVERROR_INVALIDDATA;
507 
508  if (!IS_IRAP(s)) {
509  int ref_corrupt = !ref || ref->flags & (HEVC_FRAME_FLAG_CORRUPT |
511  int recovering = HEVC_IS_RECOVERING(s);
512 
513  if (ref_corrupt && !recovering) {
514  if (!(s->avctx->flags & AV_CODEC_FLAG_OUTPUT_CORRUPT) &&
515  !(s->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL))
516  return AVERROR_INVALIDDATA;
517 
518  s->cur_frame->flags |= HEVC_FRAME_FLAG_CORRUPT;
519  }
520  }
521 
522  if (!ref) {
523  ref = generate_missing_ref(s, l, poc);
524  if (!ref)
525  return AVERROR(ENOMEM);
526  }
527 
528  list->list[list->nb_refs] = ref->poc;
529  list->ref[list->nb_refs] = ref;
530  list->nb_refs++;
531 
532  mark_ref(ref, ref_flag);
533  return 0;
534 }
535 
537 {
538  const ShortTermRPS *short_rps = s->sh.short_term_rps;
539  const LongTermRPS *long_rps = &s->sh.long_term_rps;
540  RefPicList *rps = s->rps;
541  int i, ret = 0;
542 
544 
545  /* clear the reference flags on all frames except the current one */
546  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
547  HEVCFrame *frame = &l->DPB[i];
548 
549  if (frame == s->cur_frame)
550  continue;
551 
552  mark_ref(frame, 0);
553  }
554 
555  for (i = 0; i < NB_RPS_TYPE; i++)
556  rps[i].nb_refs = 0;
557 
558  if (!short_rps)
559  goto inter_layer;
560 
561  /* add the short refs */
562  for (i = 0; i < short_rps->num_delta_pocs; i++) {
563  int poc = s->poc + short_rps->delta_poc[i];
564  int list;
565 
566  if (!(short_rps->used & (1 << i)))
567  list = ST_FOLL;
568  else if (i < short_rps->num_negative_pics)
569  list = ST_CURR_BEF;
570  else
571  list = ST_CURR_AFT;
572 
573  ret = add_candidate_ref(s, l, &rps[list], poc,
575  if (ret < 0)
576  goto fail;
577  }
578 
579  /* add the long refs */
580  for (i = 0; i < long_rps->nb_refs; i++) {
581  int poc = long_rps->poc[i];
582  int list = long_rps->used[i] ? LT_CURR : LT_FOLL;
583 
584  ret = add_candidate_ref(s, l, &rps[list], poc,
586  if (ret < 0)
587  goto fail;
588  }
589 
590 inter_layer:
591  /* add inter-layer refs */
592  if (s->sh.inter_layer_pred) {
593  HEVCLayerContext *l0 = &s->layers[0];
594 
595  av_assert0(l != l0);
596 
597  /* Given the assumption of at most two layers, refPicSet0Flag is
598  * always 1, so only RefPicSetInterLayer0 can ever contain a frame. */
599  if (l0->cur_frame) {
600  // inter-layer refs are treated as short-term here, cf. F.8.1.6
601  ret = add_candidate_ref(s, l0, &rps[INTER_LAYER0], l0->cur_frame->poc,
603  if (ret < 0)
604  goto fail;
605  }
606  }
607 
608 fail:
609  /* release any frames that are now unused */
610  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++)
611  ff_hevc_unref_frame(&l->DPB[i], 0);
612 
613  return ret;
614 }
615 
617  unsigned layer_idx)
618 {
619  int ret = 0;
620  int i;
621  const ShortTermRPS *rps = sh->short_term_rps;
622  const LongTermRPS *long_rps = &sh->long_term_rps;
623 
624  if (rps) {
625  for (i = 0; i < rps->num_negative_pics; i++)
626  ret += !!(rps->used & (1 << i));
627  for (; i < rps->num_delta_pocs; i++)
628  ret += !!(rps->used & (1 << i));
629  }
630 
631  for (i = 0; i < long_rps->nb_refs; i++)
632  ret += !!long_rps->used[i];
633 
634  if (sh->inter_layer_pred) {
635  av_assert0(pps->sps->vps->num_direct_ref_layers[layer_idx] < 2);
636  ret++;
637  }
638 
639  if (pps->pps_curr_pic_ref_enabled_flag)
640  ret++;
641 
642  return ret;
643 }
flags
const SwsFlags flags[]
Definition: swscale.c:85
av_size_mult
int av_size_mult(size_t a, size_t b, size_t *r)
Multiply two size_t values checking for overflow.
Definition: mem.c:567
ff_progress_frame_report
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition: decode.c:1973
ff_hevc_flush_dpb
void ff_hevc_flush_dpb(HEVCContext *s)
Drop all frames currently in DPB.
Definition: refs.c:76
AV_CONTAINER_FIFO_FLAG_REF
@ AV_CONTAINER_FIFO_FLAG_REF
Signal to av_container_fifo_write() that it should make a new reference to data in src rather than co...
Definition: container_fifo.h:39
HEVC_MAX_REFS
@ HEVC_MAX_REFS
Definition: hevc.h:122
AV_STEREO3D_VIEW_LEFT
@ AV_STEREO3D_VIEW_LEFT
Frame contains only the left view.
Definition: stereo3d.h:158
LT_FOLL
@ LT_FOLL
Definition: hevcdec.h:88
av_container_fifo_write
int av_container_fifo_write(AVContainerFifo *cf, void *obj, unsigned flags)
Write the contents of obj to the FIFO.
Definition: container_fifo.c:162
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
flag
int flag
Definition: cpu.c:40
HEVCWindow::bottom_offset
unsigned int bottom_offset
Definition: ps.h:95
ShortTermRPS::num_negative_pics
uint8_t num_negative_pics
Definition: ps.h:80
HEVC_VPS_MAX_LAYERS
#define HEVC_VPS_MAX_LAYERS
Definition: ps.h:35
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
HEVCSPS::bit_depth
int bit_depth
Definition: ps.h:262
HEVC_IS_RECOVERING
#define HEVC_IS_RECOVERING(s)
Definition: hevcdec.h:81
output
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
Definition: filter_design.txt:226
mask
int mask
Definition: mediacodecdec_common.c:154
container_fifo.h
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:466
data
const char data[16]
Definition: mxf.c:149
base
uint8_t base
Definition: vp3data.h:128
ff_hevc_frame_rps
int ff_hevc_frame_rps(HEVCContext *s, HEVCLayerContext *l)
Construct the reference picture sets for the current frame.
Definition: refs.c:536
RefPicList
Definition: hevcdec.h:194
AV_STEREO3D_VIEW_RIGHT
@ AV_STEREO3D_VIEW_RIGHT
Frame contains only the right view.
Definition: stereo3d.h:163
AV_STEREO3D_VIEW_UNSPEC
@ AV_STEREO3D_VIEW_UNSPEC
Content is unspecified.
Definition: stereo3d.h:168
thread.h
HEVCSPS::output_window
HEVCWindow output_window
Definition: ps.h:256
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:694
find_ref_idx
static HEVCFrame * find_ref_idx(HEVCContext *s, HEVCLayerContext *l, int poc, uint8_t use_msb)
Definition: refs.c:439
AV_CODEC_FLAG_OUTPUT_CORRUPT
#define AV_CODEC_FLAG_OUTPUT_CORRUPT
Output even those frames that might be corrupted.
Definition: avcodec.h:221
HEVC_FRAME_FLAG_LONG_REF
#define HEVC_FRAME_FLAG_LONG_REF
Definition: hevcdec.h:356
HEVCWindow::left_offset
unsigned int left_offset
Definition: ps.h:92
mark_ref
static void mark_ref(HEVCFrame *frame, int flag)
Definition: refs.c:459
RefPicList::nb_refs
int nb_refs
Definition: hevcdec.h:198
HEVCSPS::log2_max_poc_lsb
unsigned int log2_max_poc_lsb
Definition: ps.h:267
progressframe.h
refstruct.h
ff_frame_new_side_data_from_buf
int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef **buf)
Similar to ff_frame_new_side_data, but using an existing buffer ref.
Definition: decode.c:2216
av_refstruct_allocz
static void * av_refstruct_allocz(size_t size)
Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
AV_STEREO3D_FRAMESEQUENCE
@ AV_STEREO3D_FRAMESEQUENCE
Views are alternated temporally.
Definition: stereo3d.h:89
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
HEVC_SLICE_B
@ HEVC_SLICE_B
Definition: hevc.h:96
unref_missing_refs
static void unref_missing_refs(HEVCLayerContext *l)
Definition: refs.c:257
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
ff_hevc_is_alpha_video
int ff_hevc_is_alpha_video(const HEVCContext *s)
Definition: hevcdec.c:455
av_memcpy_backptr
void av_memcpy_backptr(uint8_t *dst, int back, int cnt)
Overlapping memcpy() implementation.
Definition: mem.c:447
stereo3d.h
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:2330
HEVCLayerContext::cur_frame
HEVCFrame * cur_frame
Definition: hevcdec.h:454
s
#define s(width, name)
Definition: cbs_vp9.c:198
HEVCSPS::height
int height
Definition: ps.h:348
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
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:415
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1044
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ff_progress_frame_unref
void ff_progress_frame_unref(ProgressFrame *f)
Give up a reference to the underlying frame contained in a ProgressFrame and reset the ProgressFrame,...
Definition: decode.c:1956
decode.h
hevc.h
HEVC_FRAME_FLAG_SHORT_REF
#define HEVC_FRAME_FLAG_SHORT_REF
Definition: hevcdec.h:355
ff_hevc_slice_rpl
int ff_hevc_slice_rpl(HEVCContext *s)
Construct the reference picture list(s) for the current slice.
Definition: refs.c:345
RefPicList::ref
struct HEVCFrame * ref[HEVC_MAX_REFS]
Definition: hevcdec.h:195
HEVCWindow::top_offset
unsigned int top_offset
Definition: ps.h:94
SliceHeader::collocated_list
uint8_t collocated_list
Definition: hevcdec.h:245
ShortTermRPS::num_delta_pocs
uint8_t num_delta_pocs
Definition: ps.h:81
HEVCLayerContext::tab_mvf_pool
struct AVRefStructPool * tab_mvf_pool
Definition: hevcdec.h:486
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:2600
fail
#define fail
Definition: test.h:478
IS_BLA
#define IS_BLA(s)
Definition: hevcdec.h:75
NULL
#define NULL
Definition: coverity.c:32
LongTermRPS::poc
int poc[32]
Definition: hevcdec.h:188
AV_PICTURE_STRUCTURE_TOP_FIELD
@ AV_PICTURE_STRUCTURE_TOP_FIELD
coded as top field
Definition: avcodec.h:2599
generate_missing_ref
static HEVCFrame * generate_missing_ref(HEVCContext *s, HEVCLayerContext *l, int poc)
Definition: refs.c:465
L0
#define L0
Definition: hevcdec.h:56
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:189
av_refstruct_pool_get
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition: refstruct.c:297
INTER_LAYER0
@ INTER_LAYER0
Definition: hevcdec.h:89
vps
static int FUNC() vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
Definition: cbs_h265_syntax_template.c:423
SliceHeader::nb_refs
unsigned int nb_refs[2]
Definition: hevcdec.h:237
av_frame_get_plane_buffer
AVBufferRef * av_frame_get_plane_buffer(const AVFrame *frame, int plane)
Get the buffer reference a given data plane is stored in.
Definition: frame.c:604
ff_hevc_set_new_ref
int ff_hevc_set_new_ref(HEVCContext *s, HEVCLayerContext *l, int poc)
Definition: refs.c:211
ShortTermRPS::used
uint32_t used
Definition: ps.h:77
ff_hevc_output_frames
int ff_hevc_output_frames(HEVCContext *s, unsigned layers_active_decode, unsigned layers_active_output, unsigned max_output, unsigned max_dpb, int discard)
Find frames in the DPB that are ready for output and either write them to the output FIFO or drop the...
Definition: refs.c:267
IS_IRAP
#define IS_IRAP(s)
Definition: hevcdec.h:77
LongTermRPS::used
uint8_t used[32]
Definition: hevcdec.h:190
ff_hevc_unref_frame
void ff_hevc_unref_frame(HEVCFrame *frame, int flags)
Definition: refs.c:35
HEVCSEITDRDI
Definition: sei.h:82
ST_FOLL
@ ST_FOLL
Definition: hevcdec.h:86
add_candidate_ref
static int add_candidate_ref(HEVCContext *s, HEVCLayerContext *l, RefPicList *list, int poc, int ref_flag, uint8_t use_msb)
Definition: refs.c:499
f
f
Definition: af_crystalizer.c:122
HEVCSPS::vps
const HEVCVPS * vps
RefStruct reference.
Definition: ps.h:368
ff_progress_frame_alloc
int ff_progress_frame_alloc(AVCodecContext *avctx, ProgressFrame *f)
This function sets up the ProgressFrame, i.e.
Definition: decode.c:1919
hevcdec.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
HEVCSEITDRDI::right_view_id
uint16_t right_view_id[32]
Definition: sei.h:88
HEVCSPS::chroma_format_idc
int chroma_format_idc
Definition: ps.h:254
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
HEVCSEITDRDI::left_view_id
uint16_t left_view_id[32]
Definition: sei.h:87
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
AV_FRAME_DATA_LCEVC
@ AV_FRAME_DATA_LCEVC
Raw LCEVC payload data, as a uint8_t array, with NAL emulation bytes intact.
Definition: frame.h:236
replace_alpha_plane
static int replace_alpha_plane(AVFrame *alpha, AVFrame *base)
Definition: refs.c:85
size
int size
Definition: twinvq_data.h:10344
ff_hevc_clear_refs
void ff_hevc_clear_refs(HEVCLayerContext *l)
Mark all frames in DPB as unused for reference.
Definition: refs.c:67
SliceHeader::collocated_ref_idx
unsigned int collocated_ref_idx
Definition: hevcdec.h:247
AVFrameSideData::data
uint8_t * data
Definition: frame.h:323
HEVC_FRAME_FLAG_OUTPUT
#define HEVC_FRAME_FLAG_OUTPUT
Definition: hevcdec.h:354
HEVC_FRAME_FLAG_CORRUPT
#define HEVC_FRAME_FLAG_CORRUPT
Definition: hevcdec.h:358
HEVC_FRAME_FLAG_UNAVAILABLE
#define HEVC_FRAME_FLAG_UNAVAILABLE
Definition: hevcdec.h:357
HEVCSPS::hshift
int hshift[3]
Definition: ps.h:360
AV_FRAME_DATA_VIEW_ID
@ AV_FRAME_DATA_VIEW_ID
This side data must be associated with a video frame.
Definition: frame.h:245
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1590
av_refstruct_unref
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
SliceHeader
Definition: hevcdec.h:205
AV_CODEC_FLAG2_SHOW_ALL
#define AV_CODEC_FLAG2_SHOW_ALL
Show all frames before the first keyframe.
Definition: avcodec.h:364
AV_FRAME_FLAG_CORRUPT
#define AV_FRAME_FLAG_CORRUPT
The frame data may be corrupted, e.g.
Definition: frame.h:677
HEVCFrame
Definition: hevcdec.h:360
init_slice_rpl
static int init_slice_rpl(HEVCContext *s)
Definition: refs.c:327
HEVCLayerContext
Definition: hevcdec.h:452
RefPicList::list
int list[HEVC_MAX_REFS]
Definition: hevcdec.h:196
HEVCSEITDRDI::num_ref_displays
uint8_t num_ref_displays
Definition: sei.h:86
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:496
HEVCSPS::width
int width
coded frame dimension in various units
Definition: ps.h:347
av_buffer_replace
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition: buffer.c:233
SliceHeader::list_entry_lx
unsigned int list_entry_lx[2][32]
Definition: hevcdec.h:231
HEVCFrame::poc
int poc
Definition: hevcdec.h:373
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:689
SliceHeader::short_term_rps
const ShortTermRPS * short_term_rps
Definition: hevcdec.h:228
HEVCLayerContext::sps
const HEVCSPS * sps
Definition: hevcdec.h:456
ret
ret
Definition: filter_design.txt:187
ff_hevc_get_ref_list
const RefPicList * ff_hevc_get_ref_list(const HEVCFrame *ref, int x0, int y0)
Definition: refs.c:57
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:265
ST_CURR_BEF
@ ST_CURR_BEF
Definition: hevcdec.h:84
AVStereo3D::type
enum AVStereo3DType type
How views are packed within the video.
Definition: stereo3d.h:207
sps
static int FUNC() sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
Definition: cbs_h264_syntax_template.c:260
LongTermRPS
Definition: hevcdec.h:187
SliceHeader::slice_type
enum HEVCSliceType slice_type
Definition: hevcdec.h:213
LT_CURR
@ LT_CURR
Definition: hevcdec.h:87
HEVC_NAL_CRA_NUT
@ HEVC_NAL_CRA_NUT
Definition: hevc.h:50
av_refstruct_ref_c
const void * av_refstruct_ref_c(const void *obj)
Analog of av_refstruct_ref(), but for constant objects.
Definition: refstruct.c:149
av_frame_side_data_new
AVFrameSideData * av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, size_t size, unsigned int flags)
Add new side data entry to an array.
Definition: side_data.c:203
NB_RPS_TYPE
@ NB_RPS_TYPE
Definition: hevcdec.h:91
HEVCContext
Definition: hevcdec.h:490
HEVCLayerContext::DPB
HEVCFrame DPB[32]
Definition: hevcdec.h:453
HEVCSPS::ctb_height
int ctb_height
Definition: ps.h:350
SliceHeader::rpl_modification_flag
uint8_t rpl_modification_flag[2]
Definition: hevcdec.h:233
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
pps
uint64_t pps
Definition: dovi_rpuenc.c:36
HEVCWindow::right_offset
unsigned int right_offset
Definition: ps.h:93
alloc_frame
static HEVCFrame * alloc_frame(HEVCContext *s, HEVCLayerContext *l)
Definition: refs.c:110
ShortTermRPS
Definition: ps.h:75
SliceHeader::inter_layer_pred
uint8_t inter_layer_pred
Definition: hevcdec.h:222
HEVCSPS::ctb_width
int ctb_width
Definition: ps.h:349
mem.h
HEVCSPS::vshift
int vshift[3]
Definition: ps.h:361
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
HEVCVPS
Definition: ps.h:168
av_stereo3d_create_side_data
AVStereo3D * av_stereo3d_create_side_data(AVFrame *frame)
Allocate a complete AVFrameSideData and add it to the frame.
Definition: stereo3d.c:54
HEVCSPS
Definition: ps.h:252
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:321
HEVCSPS::pixel_shift
int pixel_shift
Definition: ps.h:264
HEVCPPS
Definition: ps.h:371
ST_CURR_AFT
@ ST_CURR_AFT
Definition: hevcdec.h:85
AVStereo3D::view
enum AVStereo3DView view
Determines which views are packed.
Definition: stereo3d.h:217
LongTermRPS::nb_refs
uint8_t nb_refs
Definition: hevcdec.h:191
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
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: ps.h:76
AVStereo3D
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
Definition: stereo3d.h:203
HEVCLayerContext::rpl_tab_pool
struct AVRefStructPool * rpl_tab_pool
Definition: hevcdec.h:487
RefPicList::isLongTerm
int isLongTerm[HEVC_MAX_REFS]
Definition: hevcdec.h:197
ff_hevc_frame_nb_refs
int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps, unsigned layer_idx)
Get the number of candidate references for the current frame.
Definition: refs.c:616
SliceHeader::long_term_rps
LongTermRPS long_term_rps
Definition: hevcdec.h:230
INTER_LAYER1
@ INTER_LAYER1
Definition: hevcdec.h:90
AV_WN16
#define AV_WN16(p, v)
Definition: intreadwrite.h:368