Thanks to visit codestin.com
Credit goes to www.ffmpeg.org

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 "decode.h"
29 #include "hevc.h"
30 #include "hevcdec.h"
31 #include "progressframe.h"
32 #include "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.lcevc.info) {
126  HEVCSEILCEVC *lcevc = &s->sei.common.lcevc;
127  ret = ff_frame_new_side_data_from_buf(s->avctx, frame->tf.f,
128  AV_FRAME_DATA_LCEVC, &lcevc->info);
129  if (ret < 0)
130  goto fail;
131  }
132 
133  // add view ID side data if it's nontrivial
134  if (!ff_hevc_is_alpha_video(s) && (vps->nb_layers > 1 || view_id)) {
135  HEVCSEITDRDI *tdrdi = &s->sei.tdrdi;
136  AVFrameSideData *sd = av_frame_side_data_new(&frame->f->side_data,
137  &frame->f->nb_side_data,
139  sizeof(int), 0);
140  if (!sd)
141  goto fail;
142  *(int*)sd->data = view_id;
143 
144  if (tdrdi->num_ref_displays) {
145  AVStereo3D *stereo_3d;
146 
147  stereo_3d = av_stereo3d_create_side_data(frame->f);
148  if (!stereo_3d)
149  goto fail;
150 
151  stereo_3d->type = AV_STEREO3D_FRAMESEQUENCE;
152  if (tdrdi->left_view_id[0] == view_id)
153  stereo_3d->view = AV_STEREO3D_VIEW_LEFT;
154  else if (tdrdi->right_view_id[0] == view_id)
155  stereo_3d->view = AV_STEREO3D_VIEW_RIGHT;
156  else
157  stereo_3d->view = AV_STEREO3D_VIEW_UNSPEC;
158  }
159  }
160 
162  if (ret < 0)
163  goto fail;
164 
165  size_t rpl_bytes;
166  if (av_size_mult(s->pkt.nb_nals, sizeof(*frame->rpl), &rpl_bytes) < 0)
167  goto fail;
168  frame->rpl = av_refstruct_allocz(rpl_bytes);
169  if (!frame->rpl)
170  goto fail;
171  frame->nb_rpl_elems = s->pkt.nb_nals;
172 
174  if (!frame->tab_mvf)
175  goto fail;
176 
178  if (!frame->rpl_tab)
179  goto fail;
180  frame->ctb_count = l->sps->ctb_width * l->sps->ctb_height;
181  for (j = 0; j < frame->ctb_count; j++)
182  frame->rpl_tab[j] = frame->rpl;
183 
184  if (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD)
186  if ((s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD) ||
187  (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_BOTTOM_FIELD))
188  frame->f->flags |= AV_FRAME_FLAG_INTERLACED;
189 
190  ret = ff_hwaccel_frame_priv_alloc(s->avctx, &frame->hwaccel_picture_private);
191  if (ret < 0)
192  goto fail;
193 
194  frame->pps = av_refstruct_ref_c(s->pps);
195  if (l != &s->layers[0] && ff_hevc_is_alpha_video(s)) {
196  AVFrame *alpha = frame->f;
197  AVFrame *base = s->layers[0].cur_frame->f;
199  if (ret < 0)
200  goto fail;
201  }
202 
203  return frame;
204 fail:
206  return NULL;
207  }
208  av_log(s->avctx, AV_LOG_ERROR, "Error allocating frame, DPB full.\n");
209  return NULL;
210 }
211 
213 {
214  HEVCFrame *ref;
215  int i;
216  int no_output;
217 
218  /* check that this POC doesn't already exist */
219  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
220  HEVCFrame *frame = &l->DPB[i];
221 
222  if (frame->f && frame->poc == poc) {
223  av_log(s->avctx, AV_LOG_ERROR, "Duplicate POC in a sequence: %d.\n",
224  poc);
225  return AVERROR_INVALIDDATA;
226  }
227  }
228 
229  ref = alloc_frame(s, l);
230  if (!ref)
231  return AVERROR(ENOMEM);
232 
233  s->cur_frame = ref;
234  l->cur_frame = ref;
235  s->collocated_ref = NULL;
236 
237  ref->base_layer_frame = (l != &s->layers[0] && s->layers[0].cur_frame) ?
238  s->layers[0].cur_frame - s->layers[0].DPB : -1;
239 
240  no_output = !IS_IRAP(s) && (s->poc < s->recovery_poc) &&
242  !(s->avctx->flags & AV_CODEC_FLAG_OUTPUT_CORRUPT) &&
243  !(s->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL);
244  if (s->sh.pic_output_flag && !no_output)
246  else
248 
249  ref->poc = poc;
250  ref->f->crop_left = l->sps->output_window.left_offset;
251  ref->f->crop_right = l->sps->output_window.right_offset;
252  ref->f->crop_top = l->sps->output_window.top_offset;
253  ref->f->crop_bottom = l->sps->output_window.bottom_offset;
254 
255  return 0;
256 }
257 
259 {
260  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
261  HEVCFrame *frame = &l->DPB[i];
262  if (frame->flags & HEVC_FRAME_FLAG_UNAVAILABLE) {
264  }
265  }
266 }
267 
269  unsigned layers_active_decode, unsigned layers_active_output,
270  unsigned max_output, unsigned max_dpb, int discard)
271 {
272  while (1) {
273  int nb_dpb[HEVC_VPS_MAX_LAYERS] = { 0 };
274  int nb_output = 0;
275  int min_poc = INT_MAX;
276  int min_layer = -1;
277  int min_idx, ret = 0;
278 
279  for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
280  HEVCLayerContext *l = &s->layers[layer];
281 
282  if (!(layers_active_decode & (1 << layer)))
283  continue;
284 
285  for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
286  HEVCFrame *frame = &l->DPB[i];
287  if (frame->flags & HEVC_FRAME_FLAG_OUTPUT) {
288  // nb_output counts AUs with an output-pending frame
289  // in at least one layer
290  if (!(frame->base_layer_frame >= 0 &&
291  (s->layers[0].DPB[frame->base_layer_frame].flags & HEVC_FRAME_FLAG_OUTPUT)))
292  nb_output++;
293  if (min_layer < 0 || frame->poc < min_poc) {
294  min_poc = frame->poc;
295  min_idx = i;
296  min_layer = layer;
297  }
298  }
299  nb_dpb[layer] += !!frame->flags;
300  }
301  }
302 
303  if (nb_output > max_output ||
304  (nb_output &&
305  (nb_dpb[0] > max_dpb || nb_dpb[1] > max_dpb))) {
306  HEVCFrame *frame = &s->layers[min_layer].DPB[min_idx];
307  AVFrame *f = frame->needs_fg ? frame->frame_grain : frame->f;
308  int output = !discard && (layers_active_output & (1 << min_layer));
309 
310  if (output) {
311  if (frame->flags & HEVC_FRAME_FLAG_CORRUPT)
312  f->flags |= AV_FRAME_FLAG_CORRUPT;
313  f->pkt_dts = s->pkt_dts;
315  }
317  if (ret < 0)
318  return ret;
319 
320  av_log(s->avctx, AV_LOG_DEBUG, "%s frame with POC %d/%d.\n",
321  output ? "Output" : "Discarded", min_layer, frame->poc);
322  continue;
323  }
324  return 0;
325  }
326 }
327 
329 {
330  HEVCFrame *frame = s->cur_frame;
331  int ctb_count = frame->ctb_count;
332  int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr];
333  int i;
334 
335  if (s->slice_idx >= frame->nb_rpl_elems)
336  return AVERROR_INVALIDDATA;
337 
338  for (i = ctb_addr_ts; i < ctb_count; i++)
339  frame->rpl_tab[i] = frame->rpl + s->slice_idx;
340 
341  frame->refPicList = (RefPicList *)frame->rpl_tab[ctb_addr_ts];
342 
343  return 0;
344 }
345 
347 {
348  SliceHeader *sh = &s->sh;
349 
350  uint8_t nb_list = sh->slice_type == HEVC_SLICE_B ? 2 : 1;
351  uint8_t list_idx;
352  int i, j, ret;
353 
354  ret = init_slice_rpl(s);
355  if (ret < 0)
356  return ret;
357 
358  if (!(s->rps[ST_CURR_BEF].nb_refs + s->rps[ST_CURR_AFT].nb_refs +
359  s->rps[LT_CURR].nb_refs +
360  s->rps[INTER_LAYER0].nb_refs + s->rps[INTER_LAYER1].nb_refs) &&
361  !s->pps->pps_curr_pic_ref_enabled_flag) {
362  av_log(s->avctx, AV_LOG_ERROR, "Zero refs in the frame RPS.\n");
363  return AVERROR_INVALIDDATA;
364  }
365 
366  for (list_idx = 0; list_idx < nb_list; list_idx++) {
367  RefPicList rpl_tmp = { { 0 } };
368  RefPicList *rpl = &s->cur_frame->refPicList[list_idx];
369 
370  /* The order of the elements is
371  * ST_CURR_BEF - INTER_LAYER0 - ST_CURR_AFT - LT_CURR - INTER_LAYER1 for the L0 and
372  * ST_CURR_AFT - INTER_LAYER1 - ST_CURR_BEF - LT_CURR - INTER_LAYER0 for the L1 */
373  int cand_lists[] = { list_idx ? ST_CURR_AFT : ST_CURR_BEF,
374  list_idx ? INTER_LAYER1 : INTER_LAYER0,
375  list_idx ? ST_CURR_BEF : ST_CURR_AFT,
376  LT_CURR,
377  list_idx ? INTER_LAYER0 : INTER_LAYER1
378  };
379 
380  /* concatenate the candidate lists for the current frame */
381  while (rpl_tmp.nb_refs < sh->nb_refs[list_idx]) {
382  for (i = 0; i < FF_ARRAY_ELEMS(cand_lists); i++) {
383  RefPicList *rps = &s->rps[cand_lists[i]];
384  for (j = 0; j < rps->nb_refs && rpl_tmp.nb_refs < HEVC_MAX_REFS; j++) {
385  rpl_tmp.list[rpl_tmp.nb_refs] = rps->list[j];
386  rpl_tmp.ref[rpl_tmp.nb_refs] = rps->ref[j];
387  // multiview inter-layer refs are treated as long-term here,
388  // cf. G.8.1.3
389  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = cand_lists[i] == LT_CURR ||
390  cand_lists[i] == INTER_LAYER0 ||
391  cand_lists[i] == INTER_LAYER1;
392  rpl_tmp.nb_refs++;
393  }
394  }
395  // Construct RefPicList0, RefPicList1 (8-8, 8-10)
396  if (s->pps->pps_curr_pic_ref_enabled_flag && rpl_tmp.nb_refs < HEVC_MAX_REFS) {
397  rpl_tmp.list[rpl_tmp.nb_refs] = s->cur_frame->poc;
398  rpl_tmp.ref[rpl_tmp.nb_refs] = s->cur_frame;
399  rpl_tmp.isLongTerm[rpl_tmp.nb_refs] = 1;
400  rpl_tmp.nb_refs++;
401  }
402  }
403 
404  /* reorder the references if necessary */
405  if (sh->rpl_modification_flag[list_idx]) {
406  for (i = 0; i < sh->nb_refs[list_idx]; i++) {
407  int idx = sh->list_entry_lx[list_idx][i];
408 
409  if (idx >= rpl_tmp.nb_refs) {
410  av_log(s->avctx, AV_LOG_ERROR, "Invalid reference index.\n");
411  return AVERROR_INVALIDDATA;
412  }
413 
414  rpl->list[i] = rpl_tmp.list[idx];
415  rpl->ref[i] = rpl_tmp.ref[idx];
416  rpl->isLongTerm[i] = rpl_tmp.isLongTerm[idx];
417  rpl->nb_refs++;
418  }
419  } else {
420  memcpy(rpl, &rpl_tmp, sizeof(*rpl));
421  rpl->nb_refs = FFMIN(rpl->nb_refs, sh->nb_refs[list_idx]);
422  }
423 
424  // 8-9
425  if (s->pps->pps_curr_pic_ref_enabled_flag &&
426  !sh->rpl_modification_flag[list_idx] &&
427  rpl_tmp.nb_refs > sh->nb_refs[L0]) {
428  rpl->list[sh->nb_refs[L0] - 1] = s->cur_frame->poc;
429  rpl->ref[sh->nb_refs[L0] - 1] = s->cur_frame;
430  }
431 
432  if (sh->collocated_list == list_idx &&
433  sh->collocated_ref_idx < rpl->nb_refs)
434  s->collocated_ref = rpl->ref[sh->collocated_ref_idx];
435  }
436 
437  return 0;
438 }
439 
441  int poc, uint8_t use_msb)
442 {
443  int mask = use_msb ? ~0 : (1 << l->sps->log2_max_poc_lsb) - 1;
444  int i;
445 
446  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
447  HEVCFrame *ref = &l->DPB[i];
448  if (ref->f) {
449  if ((ref->poc & mask) == poc && (use_msb || ref->poc != s->poc))
450  return ref;
451  }
452  }
453 
454  if (s->nal_unit_type != HEVC_NAL_CRA_NUT && !IS_BLA(s))
455  av_log(s->avctx, AV_LOG_ERROR,
456  "Could not find ref with POC %d\n", poc);
457  return NULL;
458 }
459 
460 static void mark_ref(HEVCFrame *frame, int flag)
461 {
463  frame->flags |= flag;
464 }
465 
467 {
468  HEVCFrame *frame;
469 
470  frame = alloc_frame(s, l);
471  if (!frame)
472  return NULL;
473 
474  if (!s->avctx->hwaccel) {
475  int nb_planes = l->sps->chroma_format_idc ? 3 : 1;
476  if (!l->sps->pixel_shift) {
477  for (int i = 0; i < nb_planes; i++)
478  memset(frame->f->data[i], 1 << (l->sps->bit_depth - 1),
479  frame->f->linesize[i] * AV_CEIL_RSHIFT(l->sps->height, l->sps->vshift[i]));
480  } else {
481  for (int i = 0; i < nb_planes; i++)
482  for (int y = 0; y < (l->sps->height >> l->sps->vshift[i]); y++) {
483  uint8_t *dst = frame->f->data[i] + y * frame->f->linesize[i];
484  AV_WN16(dst, 1 << (l->sps->bit_depth - 1));
485  av_memcpy_backptr(dst + 2, 2, 2*(l->sps->width >> l->sps->hshift[i]) - 2);
486  }
487  }
488  }
489 
490  frame->poc = poc;
492 
493  if (s->avctx->active_thread_type == FF_THREAD_FRAME)
494  ff_progress_frame_report(&frame->tf, INT_MAX);
495 
496  return frame;
497 }
498 
499 /* add a reference with the given poc to the list and mark it as used in DPB */
501  RefPicList *list,
502  int poc, int ref_flag, uint8_t use_msb)
503 {
504  HEVCFrame *ref = find_ref_idx(s, l, poc, use_msb);
505 
506  if (ref == s->cur_frame || list->nb_refs >= HEVC_MAX_REFS)
507  return AVERROR_INVALIDDATA;
508 
509  if (!IS_IRAP(s)) {
510  int ref_corrupt = !ref || ref->flags & (HEVC_FRAME_FLAG_CORRUPT |
512  int recovering = HEVC_IS_RECOVERING(s);
513 
514  if (ref_corrupt && !recovering) {
515  if (!(s->avctx->flags & AV_CODEC_FLAG_OUTPUT_CORRUPT) &&
516  !(s->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL))
517  return AVERROR_INVALIDDATA;
518 
519  s->cur_frame->flags |= HEVC_FRAME_FLAG_CORRUPT;
520  }
521  }
522 
523  if (!ref) {
524  ref = generate_missing_ref(s, l, poc);
525  if (!ref)
526  return AVERROR(ENOMEM);
527  }
528 
529  list->list[list->nb_refs] = ref->poc;
530  list->ref[list->nb_refs] = ref;
531  list->nb_refs++;
532 
533  mark_ref(ref, ref_flag);
534  return 0;
535 }
536 
538 {
539  const ShortTermRPS *short_rps = s->sh.short_term_rps;
540  const LongTermRPS *long_rps = &s->sh.long_term_rps;
541  RefPicList *rps = s->rps;
542  int i, ret = 0;
543 
545 
546  /* clear the reference flags on all frames except the current one */
547  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
548  HEVCFrame *frame = &l->DPB[i];
549 
550  if (frame == s->cur_frame)
551  continue;
552 
553  mark_ref(frame, 0);
554  }
555 
556  for (i = 0; i < NB_RPS_TYPE; i++)
557  rps[i].nb_refs = 0;
558 
559  if (!short_rps)
560  goto inter_layer;
561 
562  /* add the short refs */
563  for (i = 0; i < short_rps->num_delta_pocs; i++) {
564  int poc = s->poc + short_rps->delta_poc[i];
565  int list;
566 
567  if (!(short_rps->used & (1 << i)))
568  list = ST_FOLL;
569  else if (i < short_rps->num_negative_pics)
570  list = ST_CURR_BEF;
571  else
572  list = ST_CURR_AFT;
573 
574  ret = add_candidate_ref(s, l, &rps[list], poc,
576  if (ret < 0)
577  goto fail;
578  }
579 
580  /* add the long refs */
581  for (i = 0; i < long_rps->nb_refs; i++) {
582  int poc = long_rps->poc[i];
583  int list = long_rps->used[i] ? LT_CURR : LT_FOLL;
584 
585  ret = add_candidate_ref(s, l, &rps[list], poc,
587  if (ret < 0)
588  goto fail;
589  }
590 
591 inter_layer:
592  /* add inter-layer refs */
593  if (s->sh.inter_layer_pred) {
594  HEVCLayerContext *l0 = &s->layers[0];
595 
596  av_assert0(l != l0);
597 
598  /* Given the assumption of at most two layers, refPicSet0Flag is
599  * always 1, so only RefPicSetInterLayer0 can ever contain a frame. */
600  if (l0->cur_frame) {
601  // inter-layer refs are treated as short-term here, cf. F.8.1.6
602  ret = add_candidate_ref(s, l0, &rps[INTER_LAYER0], l0->cur_frame->poc,
604  if (ret < 0)
605  goto fail;
606  }
607  }
608 
609 fail:
610  /* release any frames that are now unused */
611  for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++)
612  ff_hevc_unref_frame(&l->DPB[i], 0);
613 
614  return ret;
615 }
616 
618  unsigned layer_idx)
619 {
620  int ret = 0;
621  int i;
622  const ShortTermRPS *rps = sh->short_term_rps;
623  const LongTermRPS *long_rps = &sh->long_term_rps;
624 
625  if (rps) {
626  for (i = 0; i < rps->num_negative_pics; i++)
627  ret += !!(rps->used & (1 << i));
628  for (; i < rps->num_delta_pocs; i++)
629  ret += !!(rps->used & (1 << i));
630  }
631 
632  for (i = 0; i < long_rps->nb_refs; i++)
633  ret += !!long_rps->used[i];
634 
635  if (sh->inter_layer_pred) {
636  av_assert0(pps->sps->vps->num_direct_ref_layers[layer_idx] < 2);
637  ret++;
638  }
639 
640  if (pps->pps_curr_pic_ref_enabled_flag)
641  ret++;
642 
643  return ret;
644 }
flags
const SwsFlags flags[]
Definition: swscale.c:72
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:1967
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
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
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:265
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
HEVCSEILCEVC::info
AVBufferRef * info
Definition: h2645_sei.h:54
mask
int mask
Definition: mediacodecdec_common.c:154
container_fifo.h
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:435
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:537
RefPicList
Definition: hevcdec.h:194
AV_STEREO3D_VIEW_RIGHT
@ AV_STEREO3D_VIEW_RIGHT
Frame contains only the right view.
Definition: stereo3d.h:163
HEVCSEILCEVC
Definition: h2645_sei.h:53
AV_STEREO3D_VIEW_UNSPEC
@ AV_STEREO3D_VIEW_UNSPEC
Content is unspecified.
Definition: stereo3d.h:168
HEVCSPS::output_window
HEVCWindow output_window
Definition: ps.h:259
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:663
find_ref_idx
static HEVCFrame * find_ref_idx(HEVCContext *s, HEVCLayerContext *l, int poc, uint8_t use_msb)
Definition: refs.c:440
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
fail
#define fail()
Definition: checkasm.h:224
HEVC_MAX_REFS
@ HEVC_MAX_REFS
Definition: hevc.h:122
HEVCWindow::left_offset
unsigned int left_offset
Definition: ps.h:92
mark_ref
static void mark_ref(HEVCFrame *frame, int flag)
Definition: refs.c:460
RefPicList::nb_refs
int nb_refs
Definition: hevcdec.h:198
HEVCSPS::log2_max_poc_lsb
unsigned int log2_max_poc_lsb
Definition: ps.h:270
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:2210
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:258
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:454
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:2324
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:351
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:411
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:1950
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:346
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:2593
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:2592
generate_missing_ref
static HEVCFrame * generate_missing_ref(HEVCContext *s, HEVCLayerContext *l, int poc)
Definition: refs.c:466
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:212
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:268
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:500
f
f
Definition: af_crystalizer.c:122
HEVCSPS::vps
const HEVCVPS * vps
RefStruct reference.
Definition: ps.h:371
ff_progress_frame_alloc
int ff_progress_frame_alloc(AVCodecContext *avctx, ProgressFrame *f)
This function sets up the ProgressFrame, i.e.
Definition: decode.c:1913
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:257
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:292
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:363
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:1584
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:360
AV_FRAME_FLAG_CORRUPT
#define AV_FRAME_FLAG_CORRUPT
The frame data may be corrupted, e.g.
Definition: frame.h:646
HEVCFrame
Definition: hevcdec.h:360
init_slice_rpl
static int init_slice_rpl(HEVCContext *s)
Definition: refs.c:328
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:350
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:658
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
flag
#define flag(name)
Definition: cbs_av1.c:496
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:199
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:353
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:352
mem.h
HEVCSPS::vshift
int vshift[3]
Definition: ps.h:364
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
HEVCVPS
Definition: ps.h:171
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:53
HEVCSPS
Definition: ps.h:255
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:290
HEVCSPS::pixel_shift
int pixel_shift
Definition: ps.h:267
HEVCPPS
Definition: ps.h:374
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:617
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