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

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 <[email protected]>
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 <[email protected]>
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  memset(&sl->ref_list[list][len], 0, sizeof(H264Ref) * (32 - len));
160  lens[list] = len;
161  }
162 
163  if (lens[0] == lens[1] && lens[1] > 1) {
164  int i;
165  for (i = 0; i < lens[0] &&
166  sl->ref_list[0][i].parent->f->buf[0]->buffer ==
167  sl->ref_list[1][i].parent->f->buf[0]->buffer; i++);
168  if (i == lens[0]) {
169  FFSWAP(H264Ref, sl->ref_list[1][0], sl->ref_list[1][1]);
170  }
171  }
172  } else {
174  h->short_ref, h->short_ref_count, 0, h->picture_structure);
175  len += build_def_list(sl->ref_list[0] + len,
176  FF_ARRAY_ELEMS(sl->ref_list[0]) - len,
177  h-> long_ref, 16, 1, h->picture_structure);
178  av_assert0(len <= 32);
179 
180  memset(&sl->ref_list[0][len], 0, sizeof(H264Ref) * (32 - len));
181  }
182 #ifdef TRACE
183  for (int i = 0; i < sl->ref_count[0]; i++) {
184  ff_tlog(h->avctx, "List0: %s fn:%d 0x%p\n",
185  (sl->ref_list[0][i].parent ? (sl->ref_list[0][i].parent->long_ref ? "LT" : "ST") : "??"),
186  sl->ref_list[0][i].pic_id,
187  sl->ref_list[0][i].data[0]);
188  }
189  if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
190  for (int i = 0; i < sl->ref_count[1]; i++) {
191  ff_tlog(h->avctx, "List1: %s fn:%d 0x%p\n",
192  (sl->ref_list[1][i].parent ? (sl->ref_list[1][i].parent->long_ref ? "LT" : "ST") : "??"),
193  sl->ref_list[1][i].pic_id,
194  sl->ref_list[1][i].data[0]);
195  }
196  }
197 #endif
198 
199  for (int j = 0; j < 1 + (sl->slice_type_nos == AV_PICTURE_TYPE_B); j++) {
200  for (int i = 0; i < sl->ref_count[j]; i++) {
201  if (sl->ref_list[j][i].parent) {
202  if (mismatches_ref(h, sl->ref_list[j][i].parent)) {
203  av_log(h->avctx, AV_LOG_ERROR, "Discarding mismatching reference\n");
204  memset(&sl->ref_list[j][i], 0, sizeof(sl->ref_list[j][i]));
205  }
206  }
207  }
208  }
209  for (int i = 0; i < sl->list_count; i++)
210  h->default_ref[i] = sl->ref_list[i][0];
211 }
212 
213 /**
214  * print short term list
215  */
216 static void print_short_term(const H264Context *h)
217 {
218  if (h->avctx->debug & FF_DEBUG_MMCO) {
219  av_log(h->avctx, AV_LOG_DEBUG, "short term list:\n");
220  for (uint32_t i = 0; i < h->short_ref_count; i++) {
221  H264Picture *pic = h->short_ref[i];
222  av_log(h->avctx, AV_LOG_DEBUG, "%"PRIu32" fn:%d poc:%d %p\n",
223  i, pic->frame_num, pic->poc, pic->f->data[0]);
224  }
225  }
226 }
227 
228 /**
229  * print long term list
230  */
231 static void print_long_term(const H264Context *h)
232 {
233  if (h->avctx->debug & FF_DEBUG_MMCO) {
234  av_log(h->avctx, AV_LOG_DEBUG, "long term list:\n");
235  for (uint32_t i = 0; i < 16; i++) {
236  H264Picture *pic = h->long_ref[i];
237  if (pic) {
238  av_log(h->avctx, AV_LOG_DEBUG, "%"PRIu32" fn:%d poc:%d %p\n",
239  i, pic->frame_num, pic->poc, pic->f->data[0]);
240  }
241  }
242  }
243 }
244 
245 /**
246  * Extract structure information about the picture described by pic_num in
247  * the current decoding context (frame or field). Note that pic_num is
248  * picture number without wrapping (so, 0<=pic_num<max_pic_num).
249  * @param pic_num picture number for which to extract structure information
250  * @param structure one of PICT_XXX describing structure of picture
251  * with pic_num
252  * @return frame number (short term) or long term index of picture
253  * described by pic_num
254  */
255 static int pic_num_extract(const H264Context *h, int pic_num, int *structure)
256 {
257  *structure = h->picture_structure;
258  if (FIELD_PICTURE(h)) {
259  if (!(pic_num & 1))
260  /* opposite field */
261  *structure ^= PICT_FRAME;
262  pic_num >>= 1;
263  }
264 
265  return pic_num;
266 }
267 
269 {
270  for (int list = 0; list < sl->list_count; list++) {
271  for (int i = 0; i < sl->ref_count[list]; i++) {
272  const H264Ref *frame = &sl->ref_list[list][i];
273  H264Ref *field = &sl->ref_list[list][16 + 2 * i];
274 
275  field[0] = *frame;
276 
277  for (int j = 0; j < 3; j++)
278  field[0].linesize[j] <<= 1;
279  field[0].reference = PICT_TOP_FIELD;
280  field[0].poc = field[0].parent->field_poc[0];
281 
282  field[1] = field[0];
283 
284  for (int j = 0; j < 3; j++)
285  field[1].data[j] += frame->parent->f->linesize[j];
286  field[1].reference = PICT_BOTTOM_FIELD;
287  field[1].poc = field[1].parent->field_poc[1];
288  }
289  }
290 }
291 
293 {
296 
298 
299  for (int list = 0; list < sl->list_count; list++) {
300  int pred = sl->curr_pic_num;
301 
302  for (int index = 0; index < sl->nb_ref_modifications[list]; index++) {
303  unsigned int modification_of_pic_nums_idc = sl->ref_modifications[list][index].op;
304  unsigned int val = sl->ref_modifications[list][index].val;
305  unsigned int pic_id;
306  int i, pic_structure;
307  H264Picture *ref = NULL;
308 
309  switch (modification_of_pic_nums_idc) {
310  case 0:
311  case 1: {
312  const unsigned int abs_diff_pic_num = val + 1;
313  int frame_num;
314 
315  if (abs_diff_pic_num > sl->max_pic_num) {
316  av_log(h->avctx, AV_LOG_ERROR,
317  "abs_diff_pic_num overflow\n");
318  return AVERROR_INVALIDDATA;
319  }
320 
321  if (modification_of_pic_nums_idc == 0)
322  pred -= abs_diff_pic_num;
323  else
324  pred += abs_diff_pic_num;
325  pred &= sl->max_pic_num - 1;
326 
327  frame_num = pic_num_extract(h, pred, &pic_structure);
328 
329  for (i = h->short_ref_count - 1; i >= 0; i--) {
330  ref = h->short_ref[i];
331  assert(ref->reference);
332  assert(!ref->long_ref);
333  if (ref->frame_num == frame_num &&
334  (ref->reference & pic_structure))
335  break;
336  }
337  if (i >= 0)
338  pic_id = pred;
339  break;
340  }
341  case 2: {
342  int long_idx;
343  pic_id = val; // long_term_pic_idx
344 
345  long_idx = pic_num_extract(h, pic_id, &pic_structure);
346 
347  if (long_idx > 31U) {
348  av_log(h->avctx, AV_LOG_ERROR,
349  "long_term_pic_idx overflow\n");
350  return AVERROR_INVALIDDATA;
351  }
352  ref = h->long_ref[long_idx];
353  assert(!(ref && !ref->reference));
354  if (ref && (ref->reference & pic_structure)) {
355  assert(ref->long_ref);
356  i = 0;
357  } else {
358  i = -1;
359  }
360  break;
361  }
362  default:
363  av_assert0(0);
364  }
365 
366  if (i < 0 || mismatches_ref(h, ref)) {
367  av_log(h->avctx, AV_LOG_ERROR,
368  i < 0 ? "reference picture missing during reorder\n" :
369  "mismatching reference\n"
370  );
371  if (h->avctx->err_recognition & AV_EF_EXPLODE) {
372  return AVERROR_INVALIDDATA;
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  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  if (h->avctx->err_recognition & AV_EF_EXPLODE) {
397  av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture\n");
398  return AVERROR_INVALIDDATA;
399  }
400  av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture, default is %d\n", h->default_ref[list].poc);
401 
402  for (int i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++)
403  h->last_pocs[i] = INT_MIN;
404  if (h->default_ref[list].parent
405  && !(!FIELD_PICTURE(h) && (h->default_ref[list].reference&3) != 3))
406  sl->ref_list[list][index] = h->default_ref[list];
407  else
408  return -1;
409  }
410  if (h->noref_gray>0 && sl->ref_list[list][index].parent->gray && h->non_gray) {
411  for (int j=0; j<sl->list_count; j++) {
412  int list2 = (list+j)&1;
413  if (h->default_ref[list2].parent && !h->default_ref[list2].parent->gray
414  && !(!FIELD_PICTURE(h) && (h->default_ref[list2].reference&3) != 3)) {
415  sl->ref_list[list][index] = h->default_ref[list2];
416  av_log(h->avctx, AV_LOG_DEBUG, "replacement of gray gap frame\n");
417  break;
418  }
419  }
420  }
422  }
423  }
424 
425  if (FRAME_MBAFF(h))
427 
428  return 0;
429 }
430 
432 {
433  sl->nb_ref_modifications[0] = 0;
434  sl->nb_ref_modifications[1] = 0;
435 
436  for (int list = 0; list < sl->list_count; list++) {
437  if (!get_bits1(&sl->gb)) // ref_pic_list_modification_flag_l[01]
438  continue;
439 
440  for (int index = 0; ; index++) {
441  unsigned int op = get_ue_golomb_31(&sl->gb);
442 
443  if (op == 3)
444  break;
445 
446  if (index >= sl->ref_count[list]) {
447  av_log(logctx, AV_LOG_ERROR, "reference count overflow\n");
448  return AVERROR_INVALIDDATA;
449  } else if (op > 2) {
450  av_log(logctx, AV_LOG_ERROR,
451  "illegal modification_of_pic_nums_idc %u\n",
452  op);
453  return AVERROR_INVALIDDATA;
454  }
456  sl->ref_modifications[list][index].op = op;
457  sl->nb_ref_modifications[list]++;
458  }
459  }
460 
461  return 0;
462 }
463 
464 /**
465  * Mark a picture as no longer needed for reference. The refmask
466  * argument allows unreferencing of individual fields or the whole frame.
467  * If the picture becomes entirely unreferenced, but is being held for
468  * display purposes, it is marked as such.
469  * @param refmask mask of fields to unreference; the mask is bitwise
470  * anded with the reference marking of pic
471  * @return non-zero if pic becomes entirely unreferenced (except possibly
472  * for display purposes) zero if one of the fields remains in
473  * reference
474  */
475 static inline int unreference_pic(H264Context *h, H264Picture *pic, int refmask)
476 {
477  if (pic->reference &= refmask) {
478  return 0;
479  } else {
480  for (int i = 0; h->delayed_pic[i]; i++)
481  if(pic == h->delayed_pic[i]){
482  pic->reference = DELAYED_PIC_REF;
483  break;
484  }
485  return 1;
486  }
487 }
488 
489 /**
490  * Find a H264Picture in the short term reference list by frame number.
491  * @param frame_num frame number to search for
492  * @param idx the index into h->short_ref where returned picture is found
493  * undefined if no picture found.
494  * @return pointer to the found picture, or NULL if no pic with the provided
495  * frame number is found
496  */
497 static H264Picture *find_short(H264Context *h, int frame_num, int *idx)
498 {
499  for (int i = 0; i < h->short_ref_count; i++) {
500  H264Picture *pic = h->short_ref[i];
501  if (h->avctx->debug & FF_DEBUG_MMCO)
502  av_log(h->avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic);
503  if (pic->frame_num == frame_num) {
504  *idx = i;
505  return pic;
506  }
507  }
508  return NULL;
509 }
510 
511 /**
512  * Remove a picture from the short term reference list by its index in
513  * that list. This does no checking on the provided index; it is assumed
514  * to be valid. Other list entries are shifted down.
515  * @param i index into h->short_ref of picture to remove.
516  */
518 {
519  assert(i >= 0 && i < h->short_ref_count);
520  h->short_ref[i] = NULL;
521  if (--h->short_ref_count)
522  memmove(&h->short_ref[i], &h->short_ref[i + 1],
523  (h->short_ref_count - i) * sizeof(H264Picture*));
524 }
525 
526 /**
527  * @return the removed picture or NULL if an error occurs
528  */
529 static H264Picture *remove_short(H264Context *h, int frame_num, int ref_mask)
530 {
531  H264Picture *pic;
532  int i;
533 
534  if (h->avctx->debug & FF_DEBUG_MMCO)
535  av_log(h->avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count);
536 
537  pic = find_short(h, frame_num, &i);
538  if (pic) {
539  if (unreference_pic(h, pic, ref_mask))
541  }
542 
543  return pic;
544 }
545 
546 /**
547  * Remove a picture from the long term reference list by its index in
548  * that list.
549  * @return the removed picture or NULL if an error occurs
550  */
551 static H264Picture *remove_long(H264Context *h, int i, int ref_mask)
552 {
553  H264Picture *pic;
554 
555  pic = h->long_ref[i];
556  if (pic) {
557  if (unreference_pic(h, pic, ref_mask)) {
558  assert(h->long_ref[i]->long_ref == 1);
559  h->long_ref[i]->long_ref = 0;
560  h->long_ref[i] = NULL;
561  h->long_ref_count--;
562  }
563  }
564 
565  return pic;
566 }
567 
569 {
570  for (int i = 0; i < 16; i++)
571  remove_long(h, i, 0);
572  assert(h->long_ref_count == 0);
573 
574  if (h->short_ref_count && !h->last_pic_for_ec.f->data[0]) {
575  ff_h264_unref_picture(&h->last_pic_for_ec);
576  ff_h264_ref_picture(&h->last_pic_for_ec, h->short_ref[0]);
577  }
578 
579  for (int i = 0; i < h->short_ref_count; i++) {
580  unreference_pic(h, h->short_ref[i], 0);
581  h->short_ref[i] = NULL;
582  }
583  h->short_ref_count = 0;
584 
585  memset(h->default_ref, 0, sizeof(h->default_ref));
586 }
587 
589 {
590  MMCO *mmco = h->mmco;
591  int nb_mmco = 0;
592 
593  if (h->short_ref_count &&
594  h->long_ref_count + h->short_ref_count >= h->ps.sps->ref_frame_count &&
595  !(FIELD_PICTURE(h) && !h->first_field && h->cur_pic_ptr->reference)) {
596  mmco[0].opcode = MMCO_SHORT2UNUSED;
597  mmco[0].short_pic_num = h->short_ref[h->short_ref_count - 1]->frame_num;
598  nb_mmco = 1;
599  if (FIELD_PICTURE(h)) {
600  mmco[0].short_pic_num *= 2;
601  mmco[1].opcode = MMCO_SHORT2UNUSED;
602  mmco[1].short_pic_num = mmco[0].short_pic_num + 1;
603  nb_mmco = 2;
604  }
605  }
606 
607  h->nb_mmco = nb_mmco;
608 }
609 
611 {
612  MMCO *mmco = h->mmco;
613  int mmco_count;
614  int pps_ref_count[2] = {0};
615  int current_ref_assigned = 0, err = 0;
616 
617  if (!h->ps.sps) {
618  av_log(h->avctx, AV_LOG_ERROR, "SPS is unset\n");
619  err = AVERROR_INVALIDDATA;
620  goto out;
621  }
622 
623  if (!h->explicit_ref_marking)
625  mmco_count = h->nb_mmco;
626 
627  if ((h->avctx->debug & FF_DEBUG_MMCO) && mmco_count == 0)
628  av_log(h->avctx, AV_LOG_DEBUG, "no mmco here\n");
629 
630  for (int i = 0; i < mmco_count; i++) {
631  if (h->avctx->debug & FF_DEBUG_MMCO)
632  av_log(h->avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode,
633  h->mmco[i].short_pic_num, h->mmco[i].long_arg);
634 
635  switch (mmco[i].opcode) {
636  case MMCO_SHORT2UNUSED:
637  case MMCO_SHORT2LONG: {
638  int structure, j;
639  int frame_num = pic_num_extract(h, mmco[i].short_pic_num, &structure);
640  H264Picture *pic = find_short(h, frame_num, &j);
641 
642  if (!pic) {
643  if (mmco[i].opcode != MMCO_SHORT2LONG ||
644  !h->long_ref[mmco[i].long_arg] ||
645  h->long_ref[mmco[i].long_arg]->frame_num != frame_num) {
646  av_log(h->avctx, h->short_ref_count ? AV_LOG_ERROR : AV_LOG_DEBUG, "mmco: unref short failure\n");
647  err = AVERROR_INVALIDDATA;
648  }
649  continue;
650  }
651  if (mmco[i].opcode == MMCO_SHORT2UNUSED) {
652  if (h->avctx->debug & FF_DEBUG_MMCO)
653  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n",
654  h->mmco[i].short_pic_num, h->short_ref_count);
655  remove_short(h, frame_num, structure ^ PICT_FRAME);
656  } else {
657  if (h->long_ref[mmco[i].long_arg] != pic)
658  remove_long(h, mmco[i].long_arg, 0);
659 
661  h->long_ref[ mmco[i].long_arg ] = pic;
662  if (h->long_ref[mmco[i].long_arg]) {
663  h->long_ref[mmco[i].long_arg]->long_ref = 1;
664  h->long_ref_count++;
665  }
666  }
667  break;
668  }
669  case MMCO_LONG2UNUSED: {
670  int structure, j = pic_num_extract(h, mmco[i].long_arg, &structure);
671  H264Picture *pic = h->long_ref[j];
672  if (pic) {
673  remove_long(h, j, structure ^ PICT_FRAME);
674  } else if (h->avctx->debug & FF_DEBUG_MMCO)
675  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref long failure\n");
676  break;
677  }
678  case MMCO_LONG:
679  // Comment below left from previous code as it is an interesting note.
680  /* First field in pair is in short term list or
681  * at a different long term index.
682  * This is not allowed; see 7.4.3.3, notes 2 and 3.
683  * Report the problem and keep the pair where it is,
684  * and mark this field valid.
685  */
686  if (h->short_ref[0] == h->cur_pic_ptr) {
687  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to short and long at the same time\n");
689  }
690 
691  /* make sure the current picture is not already assigned as a long ref */
692  if (h->cur_pic_ptr->long_ref) {
693  for (int j = 0; j < FF_ARRAY_ELEMS(h->long_ref); j++) {
694  if (h->long_ref[j] == h->cur_pic_ptr) {
695  if (j != mmco[i].long_arg)
696  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to 2 long term references\n");
697  remove_long(h, j, 0);
698  }
699  }
700  }
701 
702  if (h->long_ref[mmco[i].long_arg] != h->cur_pic_ptr) {
703  av_assert0(!h->cur_pic_ptr->long_ref);
704  remove_long(h, mmco[i].long_arg, 0);
705 
706  h->long_ref[mmco[i].long_arg] = h->cur_pic_ptr;
707  h->long_ref[mmco[i].long_arg]->long_ref = 1;
708  h->long_ref_count++;
709  }
710 
711  h->cur_pic_ptr->reference |= h->picture_structure;
712  current_ref_assigned = 1;
713  break;
714  case MMCO_SET_MAX_LONG:
715  assert(mmco[i].long_arg <= 16);
716  // just remove the long term which index is greater than new max
717  for (int j = mmco[i].long_arg; j < 16; j++)
718  remove_long(h, j, 0);
719  break;
720  case MMCO_RESET:
721  while (h->short_ref_count) {
722  remove_short(h, h->short_ref[0]->frame_num, 0);
723  }
724  for (int j = 0; j < 16; j++)
725  remove_long(h, j, 0);
726  h->poc.frame_num = h->cur_pic_ptr->frame_num = 0;
727  h->mmco_reset = 1;
728  h->cur_pic_ptr->mmco_reset = 1;
729  for (int j = 0; j < FF_ARRAY_ELEMS(h->last_pocs); j++)
730  h->last_pocs[j] = INT_MIN;
731  break;
732  default: av_assert0(0);
733  }
734  }
735 
736  if (!current_ref_assigned) {
737  /* Second field of complementary field pair; the first field of
738  * which is already referenced. If short referenced, it
739  * should be first entry in short_ref. If not, it must exist
740  * in long_ref; trying to put it on the short list here is an
741  * error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3).
742  */
743  if (h->short_ref_count && h->short_ref[0] == h->cur_pic_ptr) {
744  /* Just mark the second field valid */
745  h->cur_pic_ptr->reference |= h->picture_structure;
746  } else if (h->cur_pic_ptr->long_ref) {
747  av_log(h->avctx, AV_LOG_ERROR, "illegal short term reference "
748  "assignment for second field "
749  "in complementary field pair "
750  "(first field is long term)\n");
751  err = AVERROR_INVALIDDATA;
752  } else {
753  H264Picture *pic = remove_short(h, h->cur_pic_ptr->frame_num, 0);
754  if (pic) {
755  av_log(h->avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n");
756  err = AVERROR_INVALIDDATA;
757  }
758 
759  if (h->short_ref_count)
760  memmove(&h->short_ref[1], &h->short_ref[0],
761  h->short_ref_count * sizeof(H264Picture*));
762 
763  h->short_ref[0] = h->cur_pic_ptr;
764  h->short_ref_count++;
765  h->cur_pic_ptr->reference |= h->picture_structure;
766  }
767  }
768 
769  if (h->long_ref_count + h->short_ref_count > FFMAX(h->ps.sps->ref_frame_count, 1)) {
770 
771  /* We have too many reference frames, probably due to corrupted
772  * stream. Need to discard one frame. Prevents overrun of the
773  * short_ref and long_ref buffers.
774  */
775  av_log(h->avctx, AV_LOG_ERROR,
776  "number of reference frames (%d+%d) exceeds max (%d; probably "
777  "corrupt input), discarding one\n",
778  h->long_ref_count, h->short_ref_count, h->ps.sps->ref_frame_count);
779  err = AVERROR_INVALIDDATA;
780 
781  if (h->long_ref_count && !h->short_ref_count) {
782  int i;
783  for (i = 0; i < 16; ++i)
784  if (h->long_ref[i])
785  break;
786 
787  assert(i < 16);
788  remove_long(h, i, 0);
789  } else {
790  H264Picture *pic = h->short_ref[h->short_ref_count - 1];
791  remove_short(h, pic->frame_num, 0);
792  }
793  }
794 
795  for (int i = 0; i < h->short_ref_count; i++) {
796  H264Picture *pic = h->short_ref[i];
797  if (pic->invalid_gap) {
798  int d = av_zero_extend(h->cur_pic_ptr->frame_num - pic->frame_num, h->ps.sps->log2_max_frame_num);
799  if (d > h->ps.sps->ref_frame_count)
800  remove_short(h, pic->frame_num, 0);
801  }
802  }
803 
806 
807  for (int i = 0; i < FF_ARRAY_ELEMS(h->ps.pps_list); i++) {
808  if (h->ps.pps_list[i]) {
809  const PPS *pps = h->ps.pps_list[i];
810  pps_ref_count[0] = FFMAX(pps_ref_count[0], pps->ref_count[0]);
811  pps_ref_count[1] = FFMAX(pps_ref_count[1], pps->ref_count[1]);
812  }
813  }
814 
815  // Detect unmarked random access points
816  if ( err >= 0
817  && h->long_ref_count==0
818  && ( h->short_ref_count<=2
819  || pps_ref_count[0] <= 2 && pps_ref_count[1] <= 1 && h->avctx->has_b_frames
820  || pps_ref_count[0] <= 1 + (h->picture_structure != PICT_FRAME) && pps_ref_count[1] <= 1)
821  && pps_ref_count[0]<=2 + (h->picture_structure != PICT_FRAME) + (2*!h->has_recovery_point)
822  && h->cur_pic_ptr->f->pict_type == AV_PICTURE_TYPE_I){
823  h->cur_pic_ptr->recovered |= FRAME_RECOVERED_HEURISTIC;
824  if(!h->avctx->has_b_frames)
825  h->frame_recovered |= FRAME_RECOVERED_HEURISTIC;
826  }
827 
828 out:
829  return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0;
830 }
831 
833  const H2645NAL *nal, void *logctx)
834 {
835  MMCO *mmco = sl->mmco;
836  int nb_mmco = 0;
837 
838  if (nal->type == H264_NAL_IDR_SLICE) { // FIXME fields
839  skip_bits1(gb); // broken_link
840  if (get_bits1(gb)) {
841  mmco[0].opcode = MMCO_LONG;
842  mmco[0].long_arg = 0;
843  nb_mmco = 1;
844  }
845  sl->explicit_ref_marking = 1;
846  } else {
848  if (sl->explicit_ref_marking) {
849  int i;
850  for (i = 0; i < FF_ARRAY_ELEMS(sl->mmco); i++) {
851  MMCOOpcode opcode = get_ue_golomb_31(gb);
852 
853  mmco[i].opcode = opcode;
854  if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) {
855  mmco[i].short_pic_num =
856  (sl->curr_pic_num - get_ue_golomb_long(gb) - 1) &
857  (sl->max_pic_num - 1);
858  }
859  if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED ||
860  opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) {
861  unsigned int long_arg = get_ue_golomb_31(gb);
862  if (long_arg >= 32 ||
863  (long_arg >= 16 && !(opcode == MMCO_SET_MAX_LONG &&
864  long_arg == 16) &&
865  !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE(sl)))) {
866  av_log(logctx, AV_LOG_ERROR,
867  "illegal long ref in memory management control "
868  "operation %d\n", opcode);
869  sl->nb_mmco = i;
870  return -1;
871  }
872  mmco[i].long_arg = long_arg;
873  }
874 
875  if (opcode > (unsigned) MMCO_LONG) {
876  av_log(logctx, AV_LOG_ERROR,
877  "illegal memory management control operation %d\n",
878  opcode);
879  sl->nb_mmco = i;
880  return -1;
881  }
882  if (opcode == MMCO_END)
883  break;
884  }
885  nb_mmco = i;
886  }
887  }
888 
889  sl->nb_mmco = nb_mmco;
890 
891  return 0;
892 }
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:107
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:517
H264SliceContext::nb_ref_modifications
int nb_ref_modifications[2]
Definition: h264dec.h:277
MMCO::long_arg
int long_arg
index, pic_num, or num long refs depending on opcode
Definition: h264dec.h:109
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:332
H264SliceContext::nb_mmco
int nb_mmco
Definition: h264dec.h:323
print_long_term
static void print_long_term(const H264Context *h)
print long term list
Definition: h264_refs.c:231
H264Picture::poc
int poc
frame POC
Definition: h264dec.h:133
H264Picture::f
AVFrame * f
Definition: h264dec.h:113
out
static 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:167
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:435
H264SliceContext::val
uint32_t val
Definition: h264dec.h:275
H264Ref::pic_id
int pic_id
Definition: h264dec.h:173
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:268
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:431
mpegutils.h
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:612
MMCOOpcode
MMCOOpcode
Memory management control operation opcode.
Definition: h264_parse.h:59
H264Picture::invalid_gap
int invalid_gap
Definition: h264dec.h:152
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:551
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:456
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:134
H264SliceContext
Definition: h264dec.h:178
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:168
FRAME_RECOVERED_HEURISTIC
#define FRAME_RECOVERED_HEURISTIC
Recovery point detected by heuristic.
Definition: h264dec.h:531
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:497
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:65
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:610
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:832
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
ff_h264_remove_all_refs
void ff_h264_remove_all_refs(H264Context *h)
Definition: h264_refs.c:568
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:1396
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:255
MMCO::short_pic_num
int short_pic_num
pic_num without wrapping (pic_num & max_pic_num)
Definition: h264dec.h:108
H264SliceContext::curr_pic_num
int curr_pic_num
Definition: h264dec.h:331
if
if(ret)
Definition: filter_design.txt:179
NULL
#define NULL
Definition: coverity.c:32
H264Ref::parent
const H264Picture * parent
Definition: h264dec.h:175
H264Ref::linesize
int linesize[3]
Definition: h264dec.h:169
H264_NAL_IDR_SLICE
@ H264_NAL_IDR_SLICE
Definition: h264.h:39
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:391
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:216
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:137
MMCO_END
@ MMCO_END
Definition: h264_parse.h:60
f
f
Definition: af_crystalizer.c:122
H264Picture::reference
int reference
Definition: h264dec.h:150
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
H264Picture::gray
int gray
Definition: h264dec.h:164
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:324
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:475
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:416
H264SliceContext::slice_type_nos
int slice_type_nos
S free slice type (SI/SP are remapped to I/P)
Definition: h264dec.h:185
av_zero_extend
#define av_zero_extend
Definition: common.h:151
FRAME_MBAFF
#define FRAME_MBAFF(h)
Definition: h264dec.h:64
h264dec.h
H264Context
H264Context.
Definition: h264dec.h:338
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
nal
static int FUNC() nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
Definition: cbs_lcevc_syntax_template.c:657
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:269
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:529
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:292
generate_sliding_window_mmcos
static void generate_sliding_window_mmcos(H264Context *h)
Definition: h264_refs.c:588
H264Picture::field_poc
int field_poc[2]
top/bottom POC
Definition: h264dec.h:132
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:322
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
H264SliceContext::ref_modifications
struct H264SliceContext::@141 ref_modifications[2][32]
H264Picture
Definition: h264dec.h:112
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:268
H264SliceContext::ref_list
H264Ref ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs.
Definition: h264dec.h:270
H264SliceContext::op
uint8_t op
Definition: h264dec.h:274
MMCO
Memory management control operation.
Definition: h264dec.h:106
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:180
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:172
H264Picture::long_ref
int long_ref
1->long term reference 0->short term reference
Definition: h264dec.h:139
H264Ref::reference
int reference
Definition: h264dec.h:171
src
#define src
Definition: vp8dsp.c:248