FFmpeg
h264_refs.c
Go to the documentation of this file.
1 /*
2  * H.26L/H.264/AVC/JVT/14496-10/... reference picture handling
3  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * H.264 / AVC / MPEG-4 part10 reference picture handling.
25  * @author Michael Niedermayer <michaelni@gmx.at>
26  */
27 
28 #include <inttypes.h>
29 
30 #include "libavutil/avassert.h"
31 #include "avcodec.h"
32 #include "h264.h"
33 #include "h264dec.h"
34 #include "golomb.h"
35 #include "mpegutils.h"
36 
37 #include <assert.h>
38 
39 static void pic_as_field(H264Ref *pic, const int parity)
40 {
41  for (int i = 0; i < FF_ARRAY_ELEMS(pic->data); ++i) {
43  pic->data[i] += pic->linesize[i];
44  pic->reference = parity;
45  pic->linesize[i] *= 2;
46  }
47  pic->poc = pic->parent->field_poc[parity == PICT_BOTTOM_FIELD];
48 }
49 
51 {
52  memcpy(dst->data, src->f->data, sizeof(dst->data));
53  memcpy(dst->linesize, src->f->linesize, sizeof(dst->linesize));
54  dst->reference = src->reference;
55  dst->poc = src->poc;
56  dst->pic_id = src->pic_id;
57  dst->parent = src;
58 }
59 
60 static int split_field_copy(H264Ref *dest, const H264Picture *src,
61  int parity, int id_add)
62 {
63  int match = !!(src->reference & parity);
64 
65  if (match) {
66  ref_from_h264pic(dest, src);
67  if (parity != PICT_FRAME) {
68  pic_as_field(dest, parity);
69  dest->pic_id *= 2;
70  dest->pic_id += id_add;
71  }
72  }
73 
74  return match;
75 }
76 
77 static int build_def_list(H264Ref *def, int def_len,
78  H264Picture * const *in, int len, int is_long, int sel)
79 {
80  int i[2] = { 0 };
81  int index = 0;
82 
83  while (i[0] < len || i[1] < len) {
84  while (i[0] < len && !(in[i[0]] && (in[i[0]]->reference & sel)))
85  i[0]++;
86  while (i[1] < len && !(in[i[1]] && (in[i[1]]->reference & (sel ^ 3))))
87  i[1]++;
88  if (i[0] < len) {
89  av_assert0(index < def_len);
90  in[i[0]]->pic_id = is_long ? i[0] : in[i[0]]->frame_num;
91  split_field_copy(&def[index++], in[i[0]++], sel, 1);
92  }
93  if (i[1] < len) {
94  av_assert0(index < def_len);
95  in[i[1]]->pic_id = is_long ? i[1] : in[i[1]]->frame_num;
96  split_field_copy(&def[index++], in[i[1]++], sel ^ 3, 0);
97  }
98  }
99 
100  return index;
101 }
102 
103 static int add_sorted(H264Picture **sorted, H264Picture * const *src,
104  int len, int limit, int dir)
105 {
106  int out_i = 0;
107 
108  for (;;) {
109  int best_poc = dir ? INT_MIN : INT_MAX;
110 
111  for (int i = 0; i < len; i++) {
112  const int poc = src[i]->poc;
113  if (((poc > limit) ^ dir) && ((poc < best_poc) ^ dir)) {
114  best_poc = poc;
115  sorted[out_i] = src[i];
116  }
117  }
118  if (best_poc == (dir ? INT_MIN : INT_MAX))
119  break;
120  limit = sorted[out_i++]->poc - dir;
121  }
122  return out_i;
123 }
124 
125 static int mismatches_ref(const H264Context *h, const H264Picture *pic)
126 {
127  const AVFrame *f = pic->f;
128  return (h->cur_pic_ptr->f->width != f->width ||
129  h->cur_pic_ptr->f->height != f->height ||
130  h->cur_pic_ptr->f->format != f->format);
131 }
132 
134 {
135  int len;
136 
137  if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
138  H264Picture *sorted[32];
139  int cur_poc;
140  int lens[2];
141 
142  if (FIELD_PICTURE(h))
143  cur_poc = h->cur_pic_ptr->field_poc[h->picture_structure == PICT_BOTTOM_FIELD];
144  else
145  cur_poc = h->cur_pic_ptr->poc;
146 
147  for (int list = 0; list < 2; list++) {
148  len = add_sorted(sorted, h->short_ref, h->short_ref_count, cur_poc, 1 ^ list);
149  len += add_sorted(sorted + len, h->short_ref, h->short_ref_count, cur_poc, 0 ^ list);
150  av_assert0(len <= 32);
151 
153  sorted, len, 0, h->picture_structure);
154  len += build_def_list(sl->ref_list[list] + len,
155  FF_ARRAY_ELEMS(sl->ref_list[0]) - len,
156  h->long_ref, 16, 1, h->picture_structure);
157  av_assert0(len <= 32);
158 
159  if (len < sl->ref_count[list])
160  memset(&sl->ref_list[list][len], 0, sizeof(H264Ref) * (sl->ref_count[list] - len));
161  lens[list] = len;
162  }
163 
164  if (lens[0] == lens[1] && lens[1] > 1) {
165  int i;
166  for (i = 0; i < lens[0] &&
167  sl->ref_list[0][i].parent->f->buf[0]->buffer ==
168  sl->ref_list[1][i].parent->f->buf[0]->buffer; i++);
169  if (i == lens[0]) {
170  FFSWAP(H264Ref, sl->ref_list[1][0], sl->ref_list[1][1]);
171  }
172  }
173  } else {
175  h->short_ref, h->short_ref_count, 0, h->picture_structure);
176  len += build_def_list(sl->ref_list[0] + len,
177  FF_ARRAY_ELEMS(sl->ref_list[0]) - len,
178  h-> long_ref, 16, 1, h->picture_structure);
179  av_assert0(len <= 32);
180 
181  if (len < sl->ref_count[0])
182  memset(&sl->ref_list[0][len], 0, sizeof(H264Ref) * (sl->ref_count[0] - len));
183  }
184 #ifdef TRACE
185  for (int i = 0; i < sl->ref_count[0]; i++) {
186  ff_tlog(h->avctx, "List0: %s fn:%d 0x%p\n",
187  (sl->ref_list[0][i].parent ? (sl->ref_list[0][i].parent->long_ref ? "LT" : "ST") : "??"),
188  sl->ref_list[0][i].pic_id,
189  sl->ref_list[0][i].data[0]);
190  }
191  if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
192  for (int i = 0; i < sl->ref_count[1]; i++) {
193  ff_tlog(h->avctx, "List1: %s fn:%d 0x%p\n",
194  (sl->ref_list[1][i].parent ? (sl->ref_list[1][i].parent->long_ref ? "LT" : "ST") : "??"),
195  sl->ref_list[1][i].pic_id,
196  sl->ref_list[1][i].data[0]);
197  }
198  }
199 #endif
200 
201  for (int j = 0; j < 1 + (sl->slice_type_nos == AV_PICTURE_TYPE_B); j++) {
202  for (int i = 0; i < sl->ref_count[j]; i++) {
203  if (sl->ref_list[j][i].parent) {
204  if (mismatches_ref(h, sl->ref_list[j][i].parent)) {
205  av_log(h->avctx, AV_LOG_ERROR, "Discarding mismatching reference\n");
206  memset(&sl->ref_list[j][i], 0, sizeof(sl->ref_list[j][i]));
207  }
208  }
209  }
210  }
211  for (int i = 0; i < sl->list_count; i++)
212  h->default_ref[i] = sl->ref_list[i][0];
213 }
214 
215 /**
216  * print short term list
217  */
218 static void print_short_term(const H264Context *h)
219 {
220  if (h->avctx->debug & FF_DEBUG_MMCO) {
221  av_log(h->avctx, AV_LOG_DEBUG, "short term list:\n");
222  for (uint32_t i = 0; i < h->short_ref_count; i++) {
223  H264Picture *pic = h->short_ref[i];
224  av_log(h->avctx, AV_LOG_DEBUG, "%"PRIu32" fn:%d poc:%d %p\n",
225  i, pic->frame_num, pic->poc, pic->f->data[0]);
226  }
227  }
228 }
229 
230 /**
231  * print long term list
232  */
233 static void print_long_term(const H264Context *h)
234 {
235  if (h->avctx->debug & FF_DEBUG_MMCO) {
236  av_log(h->avctx, AV_LOG_DEBUG, "long term list:\n");
237  for (uint32_t i = 0; i < 16; i++) {
238  H264Picture *pic = h->long_ref[i];
239  if (pic) {
240  av_log(h->avctx, AV_LOG_DEBUG, "%"PRIu32" fn:%d poc:%d %p\n",
241  i, pic->frame_num, pic->poc, pic->f->data[0]);
242  }
243  }
244  }
245 }
246 
247 /**
248  * Extract structure information about the picture described by pic_num in
249  * the current decoding context (frame or field). Note that pic_num is
250  * picture number without wrapping (so, 0<=pic_num<max_pic_num).
251  * @param pic_num picture number for which to extract structure information
252  * @param structure one of PICT_XXX describing structure of picture
253  * with pic_num
254  * @return frame number (short term) or long term index of picture
255  * described by pic_num
256  */
257 static int pic_num_extract(const H264Context *h, int pic_num, int *structure)
258 {
259  *structure = h->picture_structure;
260  if (FIELD_PICTURE(h)) {
261  if (!(pic_num & 1))
262  /* opposite field */
263  *structure ^= PICT_FRAME;
264  pic_num >>= 1;
265  }
266 
267  return pic_num;
268 }
269 
271 {
272  for (int list = 0; list < sl->list_count; list++) {
273  for (int i = 0; i < sl->ref_count[list]; i++) {
274  const H264Ref *frame = &sl->ref_list[list][i];
275  H264Ref *field = &sl->ref_list[list][16 + 2 * i];
276 
277  field[0] = *frame;
278 
279  for (int j = 0; j < 3; j++)
280  field[0].linesize[j] <<= 1;
281  field[0].reference = PICT_TOP_FIELD;
282  field[0].poc = field[0].parent->field_poc[0];
283 
284  field[1] = field[0];
285 
286  for (int j = 0; j < 3; j++)
287  field[1].data[j] += frame->parent->f->linesize[j];
288  field[1].reference = PICT_BOTTOM_FIELD;
289  field[1].poc = field[1].parent->field_poc[1];
290  }
291  }
292 }
293 
295 {
298 
300 
301  for (int list = 0; list < sl->list_count; list++) {
302  int pred = sl->curr_pic_num;
303 
304  for (int index = 0; index < sl->nb_ref_modifications[list]; index++) {
305  unsigned int modification_of_pic_nums_idc = sl->ref_modifications[list][index].op;
306  unsigned int val = sl->ref_modifications[list][index].val;
307  unsigned int pic_id;
308  int i, pic_structure;
309  H264Picture *ref = NULL;
310 
311  switch (modification_of_pic_nums_idc) {
312  case 0:
313  case 1: {
314  const unsigned int abs_diff_pic_num = val + 1;
315  int frame_num;
316 
317  if (abs_diff_pic_num > sl->max_pic_num) {
318  av_log(h->avctx, AV_LOG_ERROR,
319  "abs_diff_pic_num overflow\n");
320  return AVERROR_INVALIDDATA;
321  }
322 
323  if (modification_of_pic_nums_idc == 0)
324  pred -= abs_diff_pic_num;
325  else
326  pred += abs_diff_pic_num;
327  pred &= sl->max_pic_num - 1;
328 
329  frame_num = pic_num_extract(h, pred, &pic_structure);
330 
331  for (i = h->short_ref_count - 1; i >= 0; i--) {
332  ref = h->short_ref[i];
333  assert(ref->reference);
334  assert(!ref->long_ref);
335  if (ref->frame_num == frame_num &&
336  (ref->reference & pic_structure))
337  break;
338  }
339  if (i >= 0)
340  pic_id = pred;
341  break;
342  }
343  case 2: {
344  int long_idx;
345  pic_id = val; // long_term_pic_idx
346 
347  long_idx = pic_num_extract(h, pic_id, &pic_structure);
348 
349  if (long_idx > 31U) {
350  av_log(h->avctx, AV_LOG_ERROR,
351  "long_term_pic_idx overflow\n");
352  return AVERROR_INVALIDDATA;
353  }
354  ref = h->long_ref[long_idx];
355  assert(!(ref && !ref->reference));
356  if (ref && (ref->reference & pic_structure)) {
357  assert(ref->long_ref);
358  i = 0;
359  } else {
360  i = -1;
361  }
362  break;
363  }
364  default:
365  av_assert0(0);
366  }
367 
368  if (i < 0 || mismatches_ref(h, ref)) {
369  av_log(h->avctx, AV_LOG_ERROR,
370  i < 0 ? "reference picture missing during reorder\n" :
371  "mismatching reference\n"
372  );
373  memset(&sl->ref_list[list][index], 0, sizeof(sl->ref_list[0][0])); // FIXME
374  } else {
375  for (i = index; i + 1 < sl->ref_count[list]; i++) {
376  if (sl->ref_list[list][i].parent &&
377  ref->long_ref == sl->ref_list[list][i].parent->long_ref &&
378  pic_id == sl->ref_list[list][i].pic_id)
379  break;
380  }
381  for (; i > index; i--) {
382  sl->ref_list[list][i] = sl->ref_list[list][i - 1];
383  }
385  if (FIELD_PICTURE(h)) {
386  pic_as_field(&sl->ref_list[list][index], pic_structure);
387  }
388  }
389  }
390  }
391  for (int list = 0; list < sl->list_count; list++) {
392  for (int index = 0; index < sl->ref_count[list]; index++) {
393  if ( !sl->ref_list[list][index].parent
394  || (!FIELD_PICTURE(h) && (sl->ref_list[list][index].reference&3) != 3)) {
395  av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture, default is %d\n", h->default_ref[list].poc);
396 
397  for (int i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++)
398  h->last_pocs[i] = INT_MIN;
399  if (h->default_ref[list].parent
400  && !(!FIELD_PICTURE(h) && (h->default_ref[list].reference&3) != 3))
401  sl->ref_list[list][index] = h->default_ref[list];
402  else
403  return -1;
404  }
405  if (h->noref_gray>0 && sl->ref_list[list][index].parent->gray && h->non_gray) {
406  for (int j=0; j<sl->list_count; j++) {
407  int list2 = (list+j)&1;
408  if (h->default_ref[list2].parent && !h->default_ref[list2].parent->gray
409  && !(!FIELD_PICTURE(h) && (h->default_ref[list2].reference&3) != 3)) {
410  sl->ref_list[list][index] = h->default_ref[list2];
411  av_log(h->avctx, AV_LOG_DEBUG, "replacement of gray gap frame\n");
412  break;
413  }
414  }
415  }
417  }
418  }
419 
420  if (FRAME_MBAFF(h))
422 
423  return 0;
424 }
425 
427 {
428  sl->nb_ref_modifications[0] = 0;
429  sl->nb_ref_modifications[1] = 0;
430 
431  for (int list = 0; list < sl->list_count; list++) {
432  if (!get_bits1(&sl->gb)) // ref_pic_list_modification_flag_l[01]
433  continue;
434 
435  for (int index = 0; ; index++) {
436  unsigned int op = get_ue_golomb_31(&sl->gb);
437 
438  if (op == 3)
439  break;
440 
441  if (index >= sl->ref_count[list]) {
442  av_log(logctx, AV_LOG_ERROR, "reference count overflow\n");
443  return AVERROR_INVALIDDATA;
444  } else if (op > 2) {
445  av_log(logctx, AV_LOG_ERROR,
446  "illegal modification_of_pic_nums_idc %u\n",
447  op);
448  return AVERROR_INVALIDDATA;
449  }
451  sl->ref_modifications[list][index].op = op;
452  sl->nb_ref_modifications[list]++;
453  }
454  }
455 
456  return 0;
457 }
458 
459 /**
460  * Mark a picture as no longer needed for reference. The refmask
461  * argument allows unreferencing of individual fields or the whole frame.
462  * If the picture becomes entirely unreferenced, but is being held for
463  * display purposes, it is marked as such.
464  * @param refmask mask of fields to unreference; the mask is bitwise
465  * anded with the reference marking of pic
466  * @return non-zero if pic becomes entirely unreferenced (except possibly
467  * for display purposes) zero if one of the fields remains in
468  * reference
469  */
470 static inline int unreference_pic(H264Context *h, H264Picture *pic, int refmask)
471 {
472  if (pic->reference &= refmask) {
473  return 0;
474  } else {
475  for (int i = 0; h->delayed_pic[i]; i++)
476  if(pic == h->delayed_pic[i]){
477  pic->reference = DELAYED_PIC_REF;
478  break;
479  }
480  return 1;
481  }
482 }
483 
484 /**
485  * Find a H264Picture in the short term reference list by frame number.
486  * @param frame_num frame number to search for
487  * @param idx the index into h->short_ref where returned picture is found
488  * undefined if no picture found.
489  * @return pointer to the found picture, or NULL if no pic with the provided
490  * frame number is found
491  */
492 static H264Picture *find_short(H264Context *h, int frame_num, int *idx)
493 {
494  for (int i = 0; i < h->short_ref_count; i++) {
495  H264Picture *pic = h->short_ref[i];
496  if (h->avctx->debug & FF_DEBUG_MMCO)
497  av_log(h->avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic);
498  if (pic->frame_num == frame_num) {
499  *idx = i;
500  return pic;
501  }
502  }
503  return NULL;
504 }
505 
506 /**
507  * Remove a picture from the short term reference list by its index in
508  * that list. This does no checking on the provided index; it is assumed
509  * to be valid. Other list entries are shifted down.
510  * @param i index into h->short_ref of picture to remove.
511  */
513 {
514  assert(i >= 0 && i < h->short_ref_count);
515  h->short_ref[i] = NULL;
516  if (--h->short_ref_count)
517  memmove(&h->short_ref[i], &h->short_ref[i + 1],
518  (h->short_ref_count - i) * sizeof(H264Picture*));
519 }
520 
521 /**
522  * @return the removed picture or NULL if an error occurs
523  */
524 static H264Picture *remove_short(H264Context *h, int frame_num, int ref_mask)
525 {
526  H264Picture *pic;
527  int i;
528 
529  if (h->avctx->debug & FF_DEBUG_MMCO)
530  av_log(h->avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count);
531 
532  pic = find_short(h, frame_num, &i);
533  if (pic) {
534  if (unreference_pic(h, pic, ref_mask))
536  }
537 
538  return pic;
539 }
540 
541 /**
542  * Remove a picture from the long term reference list by its index in
543  * that list.
544  * @return the removed picture or NULL if an error occurs
545  */
546 static H264Picture *remove_long(H264Context *h, int i, int ref_mask)
547 {
548  H264Picture *pic;
549 
550  pic = h->long_ref[i];
551  if (pic) {
552  if (unreference_pic(h, pic, ref_mask)) {
553  assert(h->long_ref[i]->long_ref == 1);
554  h->long_ref[i]->long_ref = 0;
555  h->long_ref[i] = NULL;
556  h->long_ref_count--;
557  }
558  }
559 
560  return pic;
561 }
562 
564 {
565  for (int i = 0; i < 16; i++)
566  remove_long(h, i, 0);
567  assert(h->long_ref_count == 0);
568 
569  if (h->short_ref_count && !h->last_pic_for_ec.f->data[0]) {
570  ff_h264_unref_picture(&h->last_pic_for_ec);
571  ff_h264_ref_picture(&h->last_pic_for_ec, h->short_ref[0]);
572  }
573 
574  for (int i = 0; i < h->short_ref_count; i++) {
575  unreference_pic(h, h->short_ref[i], 0);
576  h->short_ref[i] = NULL;
577  }
578  h->short_ref_count = 0;
579 
580  memset(h->default_ref, 0, sizeof(h->default_ref));
581 }
582 
584 {
585  MMCO *mmco = h->mmco;
586  int nb_mmco = 0;
587 
588  if (h->short_ref_count &&
589  h->long_ref_count + h->short_ref_count >= h->ps.sps->ref_frame_count &&
590  !(FIELD_PICTURE(h) && !h->first_field && h->cur_pic_ptr->reference)) {
591  mmco[0].opcode = MMCO_SHORT2UNUSED;
592  mmco[0].short_pic_num = h->short_ref[h->short_ref_count - 1]->frame_num;
593  nb_mmco = 1;
594  if (FIELD_PICTURE(h)) {
595  mmco[0].short_pic_num *= 2;
596  mmco[1].opcode = MMCO_SHORT2UNUSED;
597  mmco[1].short_pic_num = mmco[0].short_pic_num + 1;
598  nb_mmco = 2;
599  }
600  }
601 
602  h->nb_mmco = nb_mmco;
603 }
604 
606 {
607  MMCO *mmco = h->mmco;
608  int mmco_count;
609  int pps_ref_count[2] = {0};
610  int current_ref_assigned = 0, err = 0;
611 
612  if (!h->ps.sps) {
613  av_log(h->avctx, AV_LOG_ERROR, "SPS is unset\n");
614  err = AVERROR_INVALIDDATA;
615  goto out;
616  }
617 
618  if (!h->explicit_ref_marking)
620  mmco_count = h->nb_mmco;
621 
622  if ((h->avctx->debug & FF_DEBUG_MMCO) && mmco_count == 0)
623  av_log(h->avctx, AV_LOG_DEBUG, "no mmco here\n");
624 
625  for (int i = 0; i < mmco_count; i++) {
626  if (h->avctx->debug & FF_DEBUG_MMCO)
627  av_log(h->avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode,
628  h->mmco[i].short_pic_num, h->mmco[i].long_arg);
629 
630  switch (mmco[i].opcode) {
631  case MMCO_SHORT2UNUSED:
632  case MMCO_SHORT2LONG: {
633  int structure, j;
634  int frame_num = pic_num_extract(h, mmco[i].short_pic_num, &structure);
635  H264Picture *pic = find_short(h, frame_num, &j);
636 
637  if (!pic) {
638  if (mmco[i].opcode != MMCO_SHORT2LONG ||
639  !h->long_ref[mmco[i].long_arg] ||
640  h->long_ref[mmco[i].long_arg]->frame_num != frame_num) {
641  av_log(h->avctx, h->short_ref_count ? AV_LOG_ERROR : AV_LOG_DEBUG, "mmco: unref short failure\n");
642  err = AVERROR_INVALIDDATA;
643  }
644  continue;
645  }
646  if (mmco[i].opcode == MMCO_SHORT2UNUSED) {
647  if (h->avctx->debug & FF_DEBUG_MMCO)
648  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n",
649  h->mmco[i].short_pic_num, h->short_ref_count);
650  remove_short(h, frame_num, structure ^ PICT_FRAME);
651  } else {
652  if (h->long_ref[mmco[i].long_arg] != pic)
653  remove_long(h, mmco[i].long_arg, 0);
654 
656  h->long_ref[ mmco[i].long_arg ] = pic;
657  if (h->long_ref[mmco[i].long_arg]) {
658  h->long_ref[mmco[i].long_arg]->long_ref = 1;
659  h->long_ref_count++;
660  }
661  }
662  break;
663  }
664  case MMCO_LONG2UNUSED: {
665  int structure, j = pic_num_extract(h, mmco[i].long_arg, &structure);
666  H264Picture *pic = h->long_ref[j];
667  if (pic) {
668  remove_long(h, j, structure ^ PICT_FRAME);
669  } else if (h->avctx->debug & FF_DEBUG_MMCO)
670  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref long failure\n");
671  break;
672  }
673  case MMCO_LONG:
674  // Comment below left from previous code as it is an interesting note.
675  /* First field in pair is in short term list or
676  * at a different long term index.
677  * This is not allowed; see 7.4.3.3, notes 2 and 3.
678  * Report the problem and keep the pair where it is,
679  * and mark this field valid.
680  */
681  if (h->short_ref[0] == h->cur_pic_ptr) {
682  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to short and long at the same time\n");
684  }
685 
686  /* make sure the current picture is not already assigned as a long ref */
687  if (h->cur_pic_ptr->long_ref) {
688  for (int j = 0; j < FF_ARRAY_ELEMS(h->long_ref); j++) {
689  if (h->long_ref[j] == h->cur_pic_ptr) {
690  if (j != mmco[i].long_arg)
691  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to 2 long term references\n");
692  remove_long(h, j, 0);
693  }
694  }
695  }
696 
697  if (h->long_ref[mmco[i].long_arg] != h->cur_pic_ptr) {
698  av_assert0(!h->cur_pic_ptr->long_ref);
699  remove_long(h, mmco[i].long_arg, 0);
700 
701  h->long_ref[mmco[i].long_arg] = h->cur_pic_ptr;
702  h->long_ref[mmco[i].long_arg]->long_ref = 1;
703  h->long_ref_count++;
704  }
705 
706  h->cur_pic_ptr->reference |= h->picture_structure;
707  current_ref_assigned = 1;
708  break;
709  case MMCO_SET_MAX_LONG:
710  assert(mmco[i].long_arg <= 16);
711  // just remove the long term which index is greater than new max
712  for (int j = mmco[i].long_arg; j < 16; j++)
713  remove_long(h, j, 0);
714  break;
715  case MMCO_RESET:
716  while (h->short_ref_count) {
717  remove_short(h, h->short_ref[0]->frame_num, 0);
718  }
719  for (int j = 0; j < 16; j++)
720  remove_long(h, j, 0);
721  h->poc.frame_num = h->cur_pic_ptr->frame_num = 0;
722  h->mmco_reset = 1;
723  h->cur_pic_ptr->mmco_reset = 1;
724  for (int j = 0; j < FF_ARRAY_ELEMS(h->last_pocs); j++)
725  h->last_pocs[j] = INT_MIN;
726  break;
727  default: av_assert0(0);
728  }
729  }
730 
731  if (!current_ref_assigned) {
732  /* Second field of complementary field pair; the first field of
733  * which is already referenced. If short referenced, it
734  * should be first entry in short_ref. If not, it must exist
735  * in long_ref; trying to put it on the short list here is an
736  * error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3).
737  */
738  if (h->short_ref_count && h->short_ref[0] == h->cur_pic_ptr) {
739  /* Just mark the second field valid */
740  h->cur_pic_ptr->reference |= h->picture_structure;
741  } else if (h->cur_pic_ptr->long_ref) {
742  av_log(h->avctx, AV_LOG_ERROR, "illegal short term reference "
743  "assignment for second field "
744  "in complementary field pair "
745  "(first field is long term)\n");
746  err = AVERROR_INVALIDDATA;
747  } else {
748  H264Picture *pic = remove_short(h, h->cur_pic_ptr->frame_num, 0);
749  if (pic) {
750  av_log(h->avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n");
751  err = AVERROR_INVALIDDATA;
752  }
753 
754  if (h->short_ref_count)
755  memmove(&h->short_ref[1], &h->short_ref[0],
756  h->short_ref_count * sizeof(H264Picture*));
757 
758  h->short_ref[0] = h->cur_pic_ptr;
759  h->short_ref_count++;
760  h->cur_pic_ptr->reference |= h->picture_structure;
761  }
762  }
763 
764  if (h->long_ref_count + h->short_ref_count > FFMAX(h->ps.sps->ref_frame_count, 1)) {
765 
766  /* We have too many reference frames, probably due to corrupted
767  * stream. Need to discard one frame. Prevents overrun of the
768  * short_ref and long_ref buffers.
769  */
770  av_log(h->avctx, AV_LOG_ERROR,
771  "number of reference frames (%d+%d) exceeds max (%d; probably "
772  "corrupt input), discarding one\n",
773  h->long_ref_count, h->short_ref_count, h->ps.sps->ref_frame_count);
774  err = AVERROR_INVALIDDATA;
775 
776  if (h->long_ref_count && !h->short_ref_count) {
777  int i;
778  for (i = 0; i < 16; ++i)
779  if (h->long_ref[i])
780  break;
781 
782  assert(i < 16);
783  remove_long(h, i, 0);
784  } else {
785  H264Picture *pic = h->short_ref[h->short_ref_count - 1];
786  remove_short(h, pic->frame_num, 0);
787  }
788  }
789 
790  for (int i = 0; i < h->short_ref_count; i++) {
791  H264Picture *pic = h->short_ref[i];
792  if (pic->invalid_gap) {
793  int d = av_zero_extend(h->cur_pic_ptr->frame_num - pic->frame_num, h->ps.sps->log2_max_frame_num);
794  if (d > h->ps.sps->ref_frame_count)
795  remove_short(h, pic->frame_num, 0);
796  }
797  }
798 
801 
802  for (int i = 0; i < FF_ARRAY_ELEMS(h->ps.pps_list); i++) {
803  if (h->ps.pps_list[i]) {
804  const PPS *pps = h->ps.pps_list[i];
805  pps_ref_count[0] = FFMAX(pps_ref_count[0], pps->ref_count[0]);
806  pps_ref_count[1] = FFMAX(pps_ref_count[1], pps->ref_count[1]);
807  }
808  }
809 
810  // Detect unmarked random access points
811  if ( err >= 0
812  && h->long_ref_count==0
813  && ( h->short_ref_count<=2
814  || pps_ref_count[0] <= 2 && pps_ref_count[1] <= 1 && h->avctx->has_b_frames
815  || pps_ref_count[0] <= 1 + (h->picture_structure != PICT_FRAME) && pps_ref_count[1] <= 1)
816  && pps_ref_count[0]<=2 + (h->picture_structure != PICT_FRAME) + (2*!h->has_recovery_point)
817  && h->cur_pic_ptr->f->pict_type == AV_PICTURE_TYPE_I){
818  h->cur_pic_ptr->recovered |= FRAME_RECOVERED_HEURISTIC;
819  if(!h->avctx->has_b_frames)
820  h->frame_recovered |= FRAME_RECOVERED_HEURISTIC;
821  }
822 
823 out:
824  return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0;
825 }
826 
828  const H2645NAL *nal, void *logctx)
829 {
830  MMCO *mmco = sl->mmco;
831  int nb_mmco = 0;
832 
833  if (nal->type == H264_NAL_IDR_SLICE) { // FIXME fields
834  skip_bits1(gb); // broken_link
835  if (get_bits1(gb)) {
836  mmco[0].opcode = MMCO_LONG;
837  mmco[0].long_arg = 0;
838  nb_mmco = 1;
839  }
840  sl->explicit_ref_marking = 1;
841  } else {
843  if (sl->explicit_ref_marking) {
844  int i;
845  for (i = 0; i < FF_ARRAY_ELEMS(sl->mmco); i++) {
846  MMCOOpcode opcode = get_ue_golomb_31(gb);
847 
848  mmco[i].opcode = opcode;
849  if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) {
850  mmco[i].short_pic_num =
851  (sl->curr_pic_num - get_ue_golomb_long(gb) - 1) &
852  (sl->max_pic_num - 1);
853  }
854  if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED ||
855  opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) {
856  unsigned int long_arg = get_ue_golomb_31(gb);
857  if (long_arg >= 32 ||
858  (long_arg >= 16 && !(opcode == MMCO_SET_MAX_LONG &&
859  long_arg == 16) &&
860  !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE(sl)))) {
861  av_log(logctx, AV_LOG_ERROR,
862  "illegal long ref in memory management control "
863  "operation %d\n", opcode);
864  sl->nb_mmco = i;
865  return -1;
866  }
867  mmco[i].long_arg = long_arg;
868  }
869 
870  if (opcode > (unsigned) MMCO_LONG) {
871  av_log(logctx, AV_LOG_ERROR,
872  "illegal memory management control operation %d\n",
873  opcode);
874  sl->nb_mmco = i;
875  return -1;
876  }
877  if (opcode == MMCO_END)
878  break;
879  }
880  nb_mmco = i;
881  }
882  }
883 
884  sl->nb_mmco = nb_mmco;
885 
886  return 0;
887 }
MMCO_LONG2UNUSED
@ MMCO_LONG2UNUSED
Definition: h264_parse.h:62
PICT_FRAME
#define PICT_FRAME
Definition: mpegutils.h:33
MMCO::opcode
MMCOOpcode opcode
Definition: h264dec.h:109
remove_short_at_index
static void remove_short_at_index(H264Context *h, int i)
Remove a picture from the short term reference list by its index in that list.
Definition: h264_refs.c:512
H264SliceContext::nb_ref_modifications
int nb_ref_modifications[2]
Definition: h264dec.h:279
MMCO::long_arg
int long_arg
index, pic_num, or num long refs depending on opcode
Definition: h264dec.h:111
MMCO_LONG
@ MMCO_LONG
Definition: h264_parse.h:66
mismatches_ref
static int mismatches_ref(const H264Context *h, const H264Picture *pic)
Definition: h264_refs.c:125
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
H264SliceContext::max_pic_num
int max_pic_num
Definition: h264dec.h:334
H264SliceContext::nb_mmco
int nb_mmco
Definition: h264dec.h:325
print_long_term
static void print_long_term(const H264Context *h)
print long term list
Definition: h264_refs.c:233
H264Picture::poc
int poc
frame POC
Definition: h264dec.h:135
H264Picture::f
AVFrame * f
Definition: h264dec.h:115
out
FILE * out
Definition: movenc.c:55
ff_h264_ref_picture
int ff_h264_ref_picture(H264Picture *dst, const H264Picture *src)
Definition: h264_picture.c:108
H264Ref
Definition: h264dec.h:169
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
H264SliceContext::val
uint32_t val
Definition: h264dec.h:277
H264Ref::pic_id
int pic_id
Definition: h264dec.h:175
data
const char data[16]
Definition: mxf.c:149
H264SliceContext::ref_count
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
Definition: h264dec.h:270
PICT_BOTTOM_FIELD
#define PICT_BOTTOM_FIELD
Definition: mpegutils.h:32
build_def_list
static int build_def_list(H264Ref *def, int def_len, H264Picture *const *in, int len, int is_long, int sel)
Definition: h264_refs.c:77
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
ff_h264_decode_ref_pic_list_reordering
int ff_h264_decode_ref_pic_list_reordering(H264SliceContext *sl, void *logctx)
Definition: h264_refs.c:426
mpegutils.h
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:587
MMCOOpcode
MMCOOpcode
Memory management control operation opcode.
Definition: h264_parse.h:59
H264Picture::invalid_gap
int invalid_gap
Definition: h264dec.h:154
remove_long
static H264Picture * remove_long(H264Context *h, int i, int ref_mask)
Remove a picture from the long term reference list by its index in that list.
Definition: h264_refs.c:546
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
MMCO_SET_MAX_LONG
@ MMCO_SET_MAX_LONG
Definition: h264_parse.h:64
H264Picture::frame_num
int frame_num
frame_num (raw frame_num from slice header)
Definition: h264dec.h:136
H264SliceContext
Definition: h264dec.h:180
golomb.h
exp golomb vlc stuff
GetBitContext
Definition: get_bits.h:108
val
static double val(void *priv, double ch)
Definition: aeval.c:77
H264Ref::data
uint8_t * data[3]
Definition: h264dec.h:170
FRAME_RECOVERED_HEURISTIC
#define FRAME_RECOVERED_HEURISTIC
Recovery point detected by heuristic.
Definition: h264dec.h:534
find_short
static H264Picture * find_short(H264Context *h, int frame_num, int *idx)
Find a H264Picture in the short term reference list by frame number.
Definition: h264_refs.c:492
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
op
static int op(uint8_t **dst, const uint8_t *dst_end, GetByteContext *gb, int pixel, int count, int *x, int width, int linesize)
Perform decode operation.
Definition: anm.c:76
FIELD_PICTURE
#define FIELD_PICTURE(h)
Definition: h264dec.h:67
ff_h264_execute_ref_pic_marking
int ff_h264_execute_ref_pic_marking(H264Context *h)
Execute the reference picture marking (memory management control operations).
Definition: h264_refs.c:605
ff_h264_decode_ref_pic_marking
int ff_h264_decode_ref_pic_marking(H264SliceContext *sl, GetBitContext *gb, const H2645NAL *nal, void *logctx)
Definition: h264_refs.c:827
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
ff_h264_remove_all_refs
void ff_h264_remove_all_refs(H264Context *h)
Definition: h264_refs.c:563
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
PICT_TOP_FIELD
#define PICT_TOP_FIELD
Definition: mpegutils.h:31
field
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this field
Definition: writing_filters.txt:78
FF_DEBUG_MMCO
#define FF_DEBUG_MMCO
Definition: avcodec.h:1384
pic_num_extract
static int pic_num_extract(const H264Context *h, int pic_num, int *structure)
Extract structure information about the picture described by pic_num in the current decoding context ...
Definition: h264_refs.c:257
MMCO::short_pic_num
int short_pic_num
pic_num without wrapping (pic_num & max_pic_num)
Definition: h264dec.h:110
H2645NAL::type
int type
NAL unit type.
Definition: h2645_parse.h:52
H264SliceContext::curr_pic_num
int curr_pic_num
Definition: h264dec.h:333
if
if(ret)
Definition: filter_design.txt:179
NULL
#define NULL
Definition: coverity.c:32
H264Ref::parent
const H264Picture * parent
Definition: h264dec.h:177
H264Ref::linesize
int linesize[3]
Definition: h264dec.h:171
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:371
PPS
Picture parameter set.
Definition: h264_ps.h:110
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
index
int index
Definition: gxfenc.c:90
print_short_term
static void print_short_term(const H264Context *h)
print short term list
Definition: h264_refs.c:218
DELAYED_PIC_REF
#define DELAYED_PIC_REF
Value of Picture.reference when Picture is not a reference picture, but is held for delayed output.
Definition: diracdec.c:69
H264Picture::pic_id
int pic_id
pic_num (short -> no wrap version of pic_num, pic_num & max_pic_num; long -> long_pic_num)
Definition: h264dec.h:139
MMCO_END
@ MMCO_END
Definition: h264_parse.h:60
f
f
Definition: af_crystalizer.c:122
H264Picture::reference
int reference
Definition: h264dec.h:152
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
H264Picture::gray
int gray
Definition: h264dec.h:166
MMCO_SHORT2UNUSED
@ MMCO_SHORT2UNUSED
Definition: h264_parse.h:61
H2645NAL
Definition: h2645_parse.h:34
parity
mcdeint parity
Definition: vf_mcdeint.c:281
MMCO_RESET
@ MMCO_RESET
Definition: h264_parse.h:65
H264SliceContext::explicit_ref_marking
int explicit_ref_marking
Definition: h264dec.h:326
unreference_pic
static int unreference_pic(H264Context *h, H264Picture *pic, int refmask)
Mark a picture as no longer needed for reference.
Definition: h264_refs.c:470
av_buffer_get_ref_count
int av_buffer_get_ref_count(const AVBufferRef *buf)
Definition: buffer.c:160
AVBufferRef::buffer
AVBuffer * buffer
Definition: buffer.h:83
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:396
H264SliceContext::slice_type_nos
int slice_type_nos
S free slice type (SI/SP are remapped to I/P)
Definition: h264dec.h:187
av_zero_extend
#define av_zero_extend
Definition: common.h:151
FRAME_MBAFF
#define FRAME_MBAFF(h)
Definition: h264dec.h:66
h264dec.h
H264Context
H264Context.
Definition: h264dec.h:340
h264_initialise_ref_list
static void h264_initialise_ref_list(H264Context *h, H264SliceContext *sl)
Definition: h264_refs.c:133
MMCO_SHORT2LONG
@ MMCO_SHORT2LONG
Definition: h264_parse.h:63
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
ref_from_h264pic
static void ref_from_h264pic(H264Ref *dst, const H264Picture *src)
Definition: h264_refs.c:50
len
int len
Definition: vorbis_enc_data.h:426
H264SliceContext::list_count
unsigned int list_count
Definition: h264dec.h:271
avcodec.h
limit
static double limit(double x)
Definition: vf_pseudocolor.c:142
pred
static const float pred[4]
Definition: siprdata.h:259
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
remove_short
static H264Picture * remove_short(H264Context *h, int frame_num, int ref_mask)
Definition: h264_refs.c:524
U
#define U(x)
Definition: vpx_arith.h:37
get_ue_golomb_31
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition: golomb.h:120
ff_h264_build_ref_list
int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl)
Definition: h264_refs.c:294
generate_sliding_window_mmcos
static void generate_sliding_window_mmcos(H264Context *h)
Definition: h264_refs.c:583
H264Picture::field_poc
int field_poc[2]
top/bottom POC
Definition: h264dec.h:134
AV_PICTURE_TYPE_B
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition: avutil.h:281
H264SliceContext::mmco
MMCO mmco[H264_MAX_MMCO_COUNT]
Definition: h264dec.h:324
add_sorted
static int add_sorted(H264Picture **sorted, H264Picture *const *src, int len, int limit, int dir)
Definition: h264_refs.c:103
split_field_copy
static int split_field_copy(H264Ref *dest, const H264Picture *src, int parity, int id_add)
Definition: h264_refs.c:60
ff_h264_unref_picture
void ff_h264_unref_picture(H264Picture *pic)
Definition: h264_picture.c:39
H264Picture
Definition: h264dec.h:114
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
pps
uint64_t pps
Definition: dovi_rpuenc.c:35
H264_NAL_IDR_SLICE
@ H264_NAL_IDR_SLICE
Definition: h264.h:39
h264_fill_mbaff_ref_list
static void h264_fill_mbaff_ref_list(H264SliceContext *sl)
Definition: h264_refs.c:270
H264SliceContext::ref_list
H264Ref ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs.
Definition: h264dec.h:272
H264SliceContext::op
uint8_t op
Definition: h264dec.h:276
MMCO
Memory management control operation.
Definition: h264dec.h:108
get_ue_golomb_long
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
Definition: golomb.h:104
H264SliceContext::ref_modifications
struct H264SliceContext::@127 ref_modifications[2][32]
ff_tlog
#define ff_tlog(a,...)
Definition: tableprint_vlc.h:29
H264SliceContext::gb
GetBitContext gb
Definition: h264dec.h:182
pic_as_field
static void pic_as_field(H264Ref *pic, const int parity)
Definition: h264_refs.c:39
h264.h
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
h
h
Definition: vp9dsp_template.c:2070
H264Ref::poc
int poc
Definition: h264dec.h:174
H264Picture::long_ref
int long_ref
1->long term reference 0->short term reference
Definition: h264dec.h:141
H264Ref::reference
int reference
Definition: h264dec.h:173
src
#define src
Definition: vp8dsp.c:248