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