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 
50 static void ref_from_h264pic(H264Ref *dst, const H264Picture *src)
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  ref->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  ref->pic_id = pic_id;
358  assert(ref->long_ref);
359  i = 0;
360  } else {
361  i = -1;
362  }
363  break;
364  }
365  default:
366  av_assert0(0);
367  }
368 
369  if (i < 0 || mismatches_ref(h, ref)) {
370  av_log(h->avctx, AV_LOG_ERROR,
371  i < 0 ? "reference picture missing during reorder\n" :
372  "mismatching reference\n"
373  );
374  memset(&sl->ref_list[list][index], 0, sizeof(sl->ref_list[0][0])); // FIXME
375  } else {
376  for (i = index; i + 1 < sl->ref_count[list]; i++) {
377  if (sl->ref_list[list][i].parent &&
378  ref->long_ref == sl->ref_list[list][i].parent->long_ref &&
379  ref->pic_id == sl->ref_list[list][i].pic_id)
380  break;
381  }
382  for (; i > index; i--) {
383  sl->ref_list[list][i] = sl->ref_list[list][i - 1];
384  }
386  if (FIELD_PICTURE(h)) {
387  pic_as_field(&sl->ref_list[list][index], pic_structure);
388  }
389  }
390  }
391  }
392  for (int list = 0; list < sl->list_count; list++) {
393  for (int index = 0; index < sl->ref_count[list]; index++) {
394  if ( !sl->ref_list[list][index].parent
395  || (!FIELD_PICTURE(h) && (sl->ref_list[list][index].reference&3) != 3)) {
396  av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture, default is %d\n", h->default_ref[list].poc);
397 
398  for (int i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++)
399  h->last_pocs[i] = INT_MIN;
400  if (h->default_ref[list].parent
401  && !(!FIELD_PICTURE(h) && (h->default_ref[list].reference&3) != 3))
402  sl->ref_list[list][index] = h->default_ref[list];
403  else
404  return -1;
405  }
406  if (h->noref_gray>0 && sl->ref_list[list][index].parent->gray && h->non_gray) {
407  for (int j=0; j<sl->list_count; j++) {
408  int list2 = (list+j)&1;
409  if (h->default_ref[list2].parent && !h->default_ref[list2].parent->gray
410  && !(!FIELD_PICTURE(h) && (h->default_ref[list2].reference&3) != 3)) {
411  sl->ref_list[list][index] = h->default_ref[list2];
412  av_log(h, AV_LOG_DEBUG, "replacement of gray gap frame\n");
413  break;
414  }
415  }
416  }
418  }
419  }
420 
421  if (FRAME_MBAFF(h))
423 
424  return 0;
425 }
426 
428 {
429  sl->nb_ref_modifications[0] = 0;
430  sl->nb_ref_modifications[1] = 0;
431 
432  for (int list = 0; list < sl->list_count; list++) {
433  if (!get_bits1(&sl->gb)) // ref_pic_list_modification_flag_l[01]
434  continue;
435 
436  for (int index = 0; ; index++) {
437  unsigned int op = get_ue_golomb_31(&sl->gb);
438 
439  if (op == 3)
440  break;
441 
442  if (index >= sl->ref_count[list]) {
443  av_log(logctx, AV_LOG_ERROR, "reference count overflow\n");
444  return AVERROR_INVALIDDATA;
445  } else if (op > 2) {
446  av_log(logctx, AV_LOG_ERROR,
447  "illegal modification_of_pic_nums_idc %u\n",
448  op);
449  return AVERROR_INVALIDDATA;
450  }
452  sl->ref_modifications[list][index].op = op;
453  sl->nb_ref_modifications[list]++;
454  }
455  }
456 
457  return 0;
458 }
459 
460 /**
461  * Mark a picture as no longer needed for reference. The refmask
462  * argument allows unreferencing of individual fields or the whole frame.
463  * If the picture becomes entirely unreferenced, but is being held for
464  * display purposes, it is marked as such.
465  * @param refmask mask of fields to unreference; the mask is bitwise
466  * anded with the reference marking of pic
467  * @return non-zero if pic becomes entirely unreferenced (except possibly
468  * for display purposes) zero if one of the fields remains in
469  * reference
470  */
471 static inline int unreference_pic(H264Context *h, H264Picture *pic, int refmask)
472 {
473  if (pic->reference &= refmask) {
474  return 0;
475  } else {
476  for (int i = 0; h->delayed_pic[i]; i++)
477  if(pic == h->delayed_pic[i]){
478  pic->reference = DELAYED_PIC_REF;
479  break;
480  }
481  return 1;
482  }
483 }
484 
485 /**
486  * Find a H264Picture in the short term reference list by frame number.
487  * @param frame_num frame number to search for
488  * @param idx the index into h->short_ref where returned picture is found
489  * undefined if no picture found.
490  * @return pointer to the found picture, or NULL if no pic with the provided
491  * frame number is found
492  */
493 static H264Picture *find_short(H264Context *h, int frame_num, int *idx)
494 {
495  for (int i = 0; i < h->short_ref_count; i++) {
496  H264Picture *pic = h->short_ref[i];
497  if (h->avctx->debug & FF_DEBUG_MMCO)
498  av_log(h->avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic);
499  if (pic->frame_num == frame_num) {
500  *idx = i;
501  return pic;
502  }
503  }
504  return NULL;
505 }
506 
507 /**
508  * Remove a picture from the short term reference list by its index in
509  * that list. This does no checking on the provided index; it is assumed
510  * to be valid. Other list entries are shifted down.
511  * @param i index into h->short_ref of picture to remove.
512  */
514 {
515  assert(i >= 0 && i < h->short_ref_count);
516  h->short_ref[i] = NULL;
517  if (--h->short_ref_count)
518  memmove(&h->short_ref[i], &h->short_ref[i + 1],
519  (h->short_ref_count - i) * sizeof(H264Picture*));
520 }
521 
522 /**
523  * @return the removed picture or NULL if an error occurs
524  */
525 static H264Picture *remove_short(H264Context *h, int frame_num, int ref_mask)
526 {
527  H264Picture *pic;
528  int i;
529 
530  if (h->avctx->debug & FF_DEBUG_MMCO)
531  av_log(h->avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count);
532 
533  pic = find_short(h, frame_num, &i);
534  if (pic) {
535  if (unreference_pic(h, pic, ref_mask))
537  }
538 
539  return pic;
540 }
541 
542 /**
543  * Remove a picture from the long term reference list by its index in
544  * that list.
545  * @return the removed picture or NULL if an error occurs
546  */
547 static H264Picture *remove_long(H264Context *h, int i, int ref_mask)
548 {
549  H264Picture *pic;
550 
551  pic = h->long_ref[i];
552  if (pic) {
553  if (unreference_pic(h, pic, ref_mask)) {
554  assert(h->long_ref[i]->long_ref == 1);
555  h->long_ref[i]->long_ref = 0;
556  h->long_ref[i] = NULL;
557  h->long_ref_count--;
558  }
559  }
560 
561  return pic;
562 }
563 
565 {
566  for (int i = 0; i < 16; i++)
567  remove_long(h, i, 0);
568  assert(h->long_ref_count == 0);
569 
570  if (h->short_ref_count && !h->last_pic_for_ec.f->data[0]) {
571  ff_h264_unref_picture(&h->last_pic_for_ec);
572  ff_h264_ref_picture(&h->last_pic_for_ec, h->short_ref[0]);
573  }
574 
575  for (int i = 0; i < h->short_ref_count; i++) {
576  unreference_pic(h, h->short_ref[i], 0);
577  h->short_ref[i] = NULL;
578  }
579  h->short_ref_count = 0;
580 
581  memset(h->default_ref, 0, sizeof(h->default_ref));
582 }
583 
585 {
586  MMCO *mmco = h->mmco;
587  int nb_mmco = 0;
588 
589  if (h->short_ref_count &&
590  h->long_ref_count + h->short_ref_count >= h->ps.sps->ref_frame_count &&
591  !(FIELD_PICTURE(h) && !h->first_field && h->cur_pic_ptr->reference)) {
592  mmco[0].opcode = MMCO_SHORT2UNUSED;
593  mmco[0].short_pic_num = h->short_ref[h->short_ref_count - 1]->frame_num;
594  nb_mmco = 1;
595  if (FIELD_PICTURE(h)) {
596  mmco[0].short_pic_num *= 2;
597  mmco[1].opcode = MMCO_SHORT2UNUSED;
598  mmco[1].short_pic_num = mmco[0].short_pic_num + 1;
599  nb_mmco = 2;
600  }
601  }
602 
603  h->nb_mmco = nb_mmco;
604 }
605 
607 {
608  MMCO *mmco = h->mmco;
609  int mmco_count;
610  int pps_ref_count[2] = {0};
611  int current_ref_assigned = 0, err = 0;
612 
613  if (!h->ps.sps) {
614  av_log(h->avctx, AV_LOG_ERROR, "SPS is unset\n");
615  err = AVERROR_INVALIDDATA;
616  goto out;
617  }
618 
619  if (!h->explicit_ref_marking)
621  mmco_count = h->nb_mmco;
622 
623  if ((h->avctx->debug & FF_DEBUG_MMCO) && mmco_count == 0)
624  av_log(h->avctx, AV_LOG_DEBUG, "no mmco here\n");
625 
626  for (int i = 0; i < mmco_count; i++) {
627  if (h->avctx->debug & FF_DEBUG_MMCO)
628  av_log(h->avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode,
629  h->mmco[i].short_pic_num, h->mmco[i].long_arg);
630 
631  switch (mmco[i].opcode) {
632  case MMCO_SHORT2UNUSED:
633  case MMCO_SHORT2LONG: {
634  int structure, j;
635  int frame_num = pic_num_extract(h, mmco[i].short_pic_num, &structure);
636  H264Picture *pic = find_short(h, frame_num, &j);
637 
638  if (!pic) {
639  if (mmco[i].opcode != MMCO_SHORT2LONG ||
640  !h->long_ref[mmco[i].long_arg] ||
641  h->long_ref[mmco[i].long_arg]->frame_num != frame_num) {
642  av_log(h->avctx, h->short_ref_count ? AV_LOG_ERROR : AV_LOG_DEBUG, "mmco: unref short failure\n");
643  err = AVERROR_INVALIDDATA;
644  }
645  continue;
646  }
647  if (mmco[i].opcode == MMCO_SHORT2UNUSED) {
648  if (h->avctx->debug & FF_DEBUG_MMCO)
649  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n",
650  h->mmco[i].short_pic_num, h->short_ref_count);
651  remove_short(h, frame_num, structure ^ PICT_FRAME);
652  } else {
653  if (h->long_ref[mmco[i].long_arg] != pic)
654  remove_long(h, mmco[i].long_arg, 0);
655 
657  h->long_ref[ mmco[i].long_arg ] = pic;
658  if (h->long_ref[mmco[i].long_arg]) {
659  h->long_ref[mmco[i].long_arg]->long_ref = 1;
660  h->long_ref_count++;
661  }
662  }
663  break;
664  }
665  case MMCO_LONG2UNUSED: {
666  int structure, j = pic_num_extract(h, mmco[i].long_arg, &structure);
667  H264Picture *pic = h->long_ref[j];
668  if (pic) {
669  remove_long(h, j, structure ^ PICT_FRAME);
670  } else if (h->avctx->debug & FF_DEBUG_MMCO)
671  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref long failure\n");
672  break;
673  }
674  case MMCO_LONG:
675  // Comment below left from previous code as it is an interesting note.
676  /* First field in pair is in short term list or
677  * at a different long term index.
678  * This is not allowed; see 7.4.3.3, notes 2 and 3.
679  * Report the problem and keep the pair where it is,
680  * and mark this field valid.
681  */
682  if (h->short_ref[0] == h->cur_pic_ptr) {
683  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to short and long at the same time\n");
685  }
686 
687  /* make sure the current picture is not already assigned as a long ref */
688  if (h->cur_pic_ptr->long_ref) {
689  for (int j = 0; j < FF_ARRAY_ELEMS(h->long_ref); j++) {
690  if (h->long_ref[j] == h->cur_pic_ptr) {
691  if (j != mmco[i].long_arg)
692  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to 2 long term references\n");
693  remove_long(h, j, 0);
694  }
695  }
696  }
697 
698  if (h->long_ref[mmco[i].long_arg] != h->cur_pic_ptr) {
699  av_assert0(!h->cur_pic_ptr->long_ref);
700  remove_long(h, mmco[i].long_arg, 0);
701 
702  h->long_ref[mmco[i].long_arg] = h->cur_pic_ptr;
703  h->long_ref[mmco[i].long_arg]->long_ref = 1;
704  h->long_ref_count++;
705  }
706 
707  h->cur_pic_ptr->reference |= h->picture_structure;
708  current_ref_assigned = 1;
709  break;
710  case MMCO_SET_MAX_LONG:
711  assert(mmco[i].long_arg <= 16);
712  // just remove the long term which index is greater than new max
713  for (int j = mmco[i].long_arg; j < 16; j++)
714  remove_long(h, j, 0);
715  break;
716  case MMCO_RESET:
717  while (h->short_ref_count) {
718  remove_short(h, h->short_ref[0]->frame_num, 0);
719  }
720  for (int j = 0; j < 16; j++)
721  remove_long(h, j, 0);
722  h->poc.frame_num = h->cur_pic_ptr->frame_num = 0;
723  h->mmco_reset = 1;
724  h->cur_pic_ptr->mmco_reset = 1;
725  for (int j = 0; j < FF_ARRAY_ELEMS(h->last_pocs); j++)
726  h->last_pocs[j] = INT_MIN;
727  break;
728  default: av_assert0(0);
729  }
730  }
731 
732  if (!current_ref_assigned) {
733  /* Second field of complementary field pair; the first field of
734  * which is already referenced. If short referenced, it
735  * should be first entry in short_ref. If not, it must exist
736  * in long_ref; trying to put it on the short list here is an
737  * error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3).
738  */
739  if (h->short_ref_count && h->short_ref[0] == h->cur_pic_ptr) {
740  /* Just mark the second field valid */
741  h->cur_pic_ptr->reference |= h->picture_structure;
742  } else if (h->cur_pic_ptr->long_ref) {
743  av_log(h->avctx, AV_LOG_ERROR, "illegal short term reference "
744  "assignment for second field "
745  "in complementary field pair "
746  "(first field is long term)\n");
747  err = AVERROR_INVALIDDATA;
748  } else {
749  H264Picture *pic = remove_short(h, h->cur_pic_ptr->frame_num, 0);
750  if (pic) {
751  av_log(h->avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n");
752  err = AVERROR_INVALIDDATA;
753  }
754 
755  if (h->short_ref_count)
756  memmove(&h->short_ref[1], &h->short_ref[0],
757  h->short_ref_count * sizeof(H264Picture*));
758 
759  h->short_ref[0] = h->cur_pic_ptr;
760  h->short_ref_count++;
761  h->cur_pic_ptr->reference |= h->picture_structure;
762  }
763  }
764 
765  if (h->long_ref_count + h->short_ref_count > FFMAX(h->ps.sps->ref_frame_count, 1)) {
766 
767  /* We have too many reference frames, probably due to corrupted
768  * stream. Need to discard one frame. Prevents overrun of the
769  * short_ref and long_ref buffers.
770  */
771  av_log(h->avctx, AV_LOG_ERROR,
772  "number of reference frames (%d+%d) exceeds max (%d; probably "
773  "corrupt input), discarding one\n",
774  h->long_ref_count, h->short_ref_count, h->ps.sps->ref_frame_count);
775  err = AVERROR_INVALIDDATA;
776 
777  if (h->long_ref_count && !h->short_ref_count) {
778  int i;
779  for (i = 0; i < 16; ++i)
780  if (h->long_ref[i])
781  break;
782 
783  assert(i < 16);
784  remove_long(h, i, 0);
785  } else {
786  H264Picture *pic = h->short_ref[h->short_ref_count - 1];
787  remove_short(h, pic->frame_num, 0);
788  }
789  }
790 
791  for (int i = 0; i < h->short_ref_count; i++) {
792  H264Picture *pic = h->short_ref[i];
793  if (pic->invalid_gap) {
794  int d = av_mod_uintp2(h->cur_pic_ptr->frame_num - pic->frame_num, h->ps.sps->log2_max_frame_num);
795  if (d > h->ps.sps->ref_frame_count)
796  remove_short(h, pic->frame_num, 0);
797  }
798  }
799 
802 
803  for (int i = 0; i < FF_ARRAY_ELEMS(h->ps.pps_list); i++) {
804  if (h->ps.pps_list[i]) {
805  const PPS *pps = h->ps.pps_list[i];
806  pps_ref_count[0] = FFMAX(pps_ref_count[0], pps->ref_count[0]);
807  pps_ref_count[1] = FFMAX(pps_ref_count[1], pps->ref_count[1]);
808  }
809  }
810 
811  // Detect unmarked random access points
812  if ( err >= 0
813  && h->long_ref_count==0
814  && ( h->short_ref_count<=2
815  || pps_ref_count[0] <= 2 && pps_ref_count[1] <= 1 && h->avctx->has_b_frames
816  || pps_ref_count[0] <= 1 + (h->picture_structure != PICT_FRAME) && pps_ref_count[1] <= 1)
817  && pps_ref_count[0]<=2 + (h->picture_structure != PICT_FRAME) + (2*!h->has_recovery_point)
818  && h->cur_pic_ptr->f->pict_type == AV_PICTURE_TYPE_I){
819  h->cur_pic_ptr->recovered |= FRAME_RECOVERED_HEURISTIC;
820  if(!h->avctx->has_b_frames)
821  h->frame_recovered |= FRAME_RECOVERED_HEURISTIC;
822  }
823 
824 out:
825  return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0;
826 }
827 
829  const H2645NAL *nal, void *logctx)
830 {
831  MMCO *mmco = sl->mmco;
832  int nb_mmco = 0;
833 
834  if (nal->type == H264_NAL_IDR_SLICE) { // FIXME fields
835  skip_bits1(gb); // broken_link
836  if (get_bits1(gb)) {
837  mmco[0].opcode = MMCO_LONG;
838  mmco[0].long_arg = 0;
839  nb_mmco = 1;
840  }
841  sl->explicit_ref_marking = 1;
842  } else {
844  if (sl->explicit_ref_marking) {
845  int i;
846  for (i = 0; i < FF_ARRAY_ELEMS(sl->mmco); i++) {
847  MMCOOpcode opcode = get_ue_golomb_31(gb);
848 
849  mmco[i].opcode = opcode;
850  if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) {
851  mmco[i].short_pic_num =
852  (sl->curr_pic_num - get_ue_golomb_long(gb) - 1) &
853  (sl->max_pic_num - 1);
854  }
855  if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED ||
856  opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) {
857  unsigned int long_arg = get_ue_golomb_31(gb);
858  if (long_arg >= 32 ||
859  (long_arg >= 16 && !(opcode == MMCO_SET_MAX_LONG &&
860  long_arg == 16) &&
861  !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE(sl)))) {
862  av_log(logctx, AV_LOG_ERROR,
863  "illegal long ref in memory management control "
864  "operation %d\n", opcode);
865  sl->nb_mmco = i;
866  return -1;
867  }
868  mmco[i].long_arg = long_arg;
869  }
870 
871  if (opcode > (unsigned) MMCO_LONG) {
872  av_log(logctx, AV_LOG_ERROR,
873  "illegal memory management control operation %d\n",
874  opcode);
875  sl->nb_mmco = i;
876  return -1;
877  }
878  if (opcode == MMCO_END)
879  break;
880  }
881  nb_mmco = i;
882  }
883  }
884 
885  sl->nb_mmco = nb_mmco;
886 
887  return 0;
888 }
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:101
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:513
H264SliceContext::nb_ref_modifications
int nb_ref_modifications[2]
Definition: h264dec.h:271
MMCO::long_arg
int long_arg
index, pic_num, or num long refs depending on opcode
Definition: h264dec.h:103
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:326
H264SliceContext::nb_mmco
int nb_mmco
Definition: h264dec.h:317
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:127
H264Picture::f
AVFrame * f
Definition: h264dec.h:107
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:161
av_mod_uintp2
#define av_mod_uintp2
Definition: common.h:126
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:374
H264SliceContext::val
uint32_t val
Definition: h264dec.h:269
H264Ref::pic_id
int pic_id
Definition: h264dec.h:167
data
const char data[16]
Definition: mxf.c:148
H264SliceContext::ref_count
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
Definition: h264dec.h:262
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:427
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:146
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:547
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:395
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:128
H264SliceContext
Definition: h264dec.h:172
golomb.h
exp golomb vlc stuff
GetBitContext
Definition: get_bits.h:108
val
static double val(void *priv, double ch)
Definition: aeval.c:78
H264Ref::data
uint8_t * data[3]
Definition: h264dec.h:162
FRAME_RECOVERED_HEURISTIC
#define FRAME_RECOVERED_HEURISTIC
Recovery point detected by heuristic.
Definition: h264dec.h:527
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:493
H264SliceContext::ref_modifications
struct H264SliceContext::@92 ref_modifications[2][32]
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
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:606
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:828
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:564
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
H264_NAL_IDR_SLICE
@ H264_NAL_IDR_SLICE
Definition: h264.h:39
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:1406
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:102
H2645NAL::type
int type
NAL unit type.
Definition: h2645_parse.h:52
H264SliceContext::curr_pic_num
int curr_pic_num
Definition: h264dec.h:325
if
if(ret)
Definition: filter_design.txt:179
NULL
#define NULL
Definition: coverity.c:32
H264Ref::parent
const H264Picture * parent
Definition: h264dec.h:169
H264Ref::linesize
int linesize[3]
Definition: h264dec.h:163
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:388
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:68
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:131
MMCO_END
@ MMCO_END
Definition: h264_parse.h:60
f
f
Definition: af_crystalizer.c:121
H264Picture::reference
int reference
Definition: h264dec.h:144
pps
static int FUNC() pps(CodedBitstreamContext *ctx, RWContext *rw, H264RawPPS *current)
Definition: cbs_h264_syntax_template.c:404
H264Picture::gray
int gray
Definition: h264dec.h:158
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:318
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:471
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:413
H264SliceContext::slice_type_nos
int slice_type_nos
S free slice type (SI/SP are remapped to I/P)
Definition: h264dec.h:179
FRAME_MBAFF
#define FRAME_MBAFF(h)
Definition: h264dec.h:66
h264dec.h
H264Context
H264Context.
Definition: h264dec.h:332
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:263
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:525
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:584
H264Picture::field_poc
int field_poc[2]
top/bottom POC
Definition: h264dec.h:126
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:316
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:106
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:112
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:264
H264SliceContext::op
uint8_t op
Definition: h264dec.h:268
MMCO
Memory management control operation.
Definition: h264dec.h:100
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
ff_tlog
#define ff_tlog(ctx,...)
Definition: internal.h:141
H264SliceContext::gb
GetBitContext gb
Definition: h264dec.h:174
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
pic_as_field
static void pic_as_field(H264Ref *pic, const int parity)
Definition: h264_refs.c:39
d
d
Definition: ffmpeg_filter.c:424
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:2038
H264Ref::poc
int poc
Definition: h264dec.h:166
H264Picture::long_ref
int long_ref
1->long term reference 0->short term reference
Definition: h264dec.h:133
H264Ref::reference
int reference
Definition: h264dec.h:165