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 / MPEG4 part10 reference picture handling.
25  * @author Michael Niedermayer <michaelni@gmx.at>
26  */
27 
28 #include "libavutil/avassert.h"
29 #include "internal.h"
30 #include "avcodec.h"
31 #include "h264.h"
32 #include "golomb.h"
33 
34 //#undef NDEBUG
35 #include <assert.h>
36 
37 #define COPY_PICTURE(dst, src) \
38 do {\
39  *(dst) = *(src);\
40  (dst)->f.extended_data = (dst)->f.data;\
41  (dst)->tf.f = &(dst)->f;\
42 } while (0)
43 
44 
45 static void pic_as_field(Picture *pic, const int parity){
46  int i;
47  for (i = 0; i < 4; ++i) {
48  if (parity == PICT_BOTTOM_FIELD)
49  pic->f.data[i] += pic->f.linesize[i];
50  pic->reference = parity;
51  pic->f.linesize[i] *= 2;
52  }
53  pic->poc= pic->field_poc[parity == PICT_BOTTOM_FIELD];
54 }
55 
56 static int split_field_copy(Picture *dest, Picture *src, int parity, int id_add)
57 {
58  int match = !!(src->reference & parity);
59 
60  if (match) {
61  COPY_PICTURE(dest, src);
62  if (parity != PICT_FRAME) {
63  pic_as_field(dest, parity);
64  dest->pic_id *= 2;
65  dest->pic_id += id_add;
66  }
67  }
68 
69  return match;
70 }
71 
72 static int build_def_list(Picture *def, Picture **in, int len, int is_long, int sel)
73 {
74  int i[2] = { 0 };
75  int index = 0;
76 
77  while (i[0] < len || i[1] < len) {
78  while (i[0] < len && !(in[i[0]] && (in[i[0]]->reference & sel)))
79  i[0]++;
80  while (i[1] < len && !(in[i[1]] && (in[i[1]]->reference & (sel ^ 3))))
81  i[1]++;
82  if (i[0] < len) {
83  in[i[0]]->pic_id = is_long ? i[0] : in[i[0]]->frame_num;
84  split_field_copy(&def[index++], in[i[0]++], sel, 1);
85  }
86  if (i[1] < len) {
87  in[i[1]]->pic_id = is_long ? i[1] : in[i[1]]->frame_num;
88  split_field_copy(&def[index++], in[i[1]++], sel ^ 3, 0);
89  }
90  }
91 
92  return index;
93 }
94 
95 static int add_sorted(Picture **sorted, Picture **src, int len, int limit, int dir)
96 {
97  int i, best_poc;
98  int out_i = 0;
99 
100  for (;;) {
101  best_poc = dir ? INT_MIN : INT_MAX;
102 
103  for (i = 0; i < len; i++) {
104  const int poc = src[i]->poc;
105  if (((poc > limit) ^ dir) && ((poc < best_poc) ^ dir)) {
106  best_poc = poc;
107  sorted[out_i] = src[i];
108  }
109  }
110  if (best_poc == (dir ? INT_MIN : INT_MAX))
111  break;
112  limit = sorted[out_i++]->poc - dir;
113  }
114  return out_i;
115 }
116 
118 {
119  int i, len;
120 
121  if (h->slice_type_nos == AV_PICTURE_TYPE_B) {
122  Picture *sorted[32];
123  int cur_poc, list;
124  int lens[2];
125 
126  if (FIELD_PICTURE(h))
128  else
129  cur_poc = h->cur_pic_ptr->poc;
130 
131  for (list = 0; list < 2; list++) {
132  len = add_sorted(sorted, h->short_ref, h->short_ref_count, cur_poc, 1 ^ list);
133  len += add_sorted(sorted + len, h->short_ref, h->short_ref_count, cur_poc, 0 ^ list);
134  av_assert0(len <= 32);
135  len = build_def_list(h->default_ref_list[list], sorted, len, 0, h->picture_structure);
136  len += build_def_list(h->default_ref_list[list] + len, h->long_ref, 16, 1, h->picture_structure);
137  av_assert0(len <= 32);
138 
139  if (len < h->ref_count[list])
140  memset(&h->default_ref_list[list][len], 0, sizeof(Picture) * (h->ref_count[list] - len));
141  lens[list] = len;
142  }
143 
144  if (lens[0] == lens[1] && lens[1] > 1) {
145  for (i = 0; h->default_ref_list[0][i].f.data[0] == h->default_ref_list[1][i].f.data[0] && i < lens[0]; i++);
146  if (i == lens[0]) {
147  Picture tmp;
148  COPY_PICTURE(&tmp, &h->default_ref_list[1][0]);
149  COPY_PICTURE(&h->default_ref_list[1][0], &h->default_ref_list[1][1]);
150  COPY_PICTURE(&h->default_ref_list[1][1], &tmp);
151  }
152  }
153  } else {
155  len += build_def_list(h->default_ref_list[0] + len, h-> long_ref, 16, 1, h->picture_structure);
156  av_assert0(len <= 32);
157  if (len < h->ref_count[0])
158  memset(&h->default_ref_list[0][len], 0, sizeof(Picture) * (h->ref_count[0] - len));
159  }
160 #ifdef TRACE
161  for (i = 0; i < h->ref_count[0]; i++) {
162  tprintf(h->avctx, "List0: %s fn:%d 0x%p\n",
163  (h->default_ref_list[0][i].long_ref ? "LT" : "ST"),
164  h->default_ref_list[0][i].pic_id,
165  h->default_ref_list[0][i].f.data[0]);
166  }
167  if (h->slice_type_nos == AV_PICTURE_TYPE_B) {
168  for (i = 0; i < h->ref_count[1]; i++) {
169  tprintf(h->avctx, "List1: %s fn:%d 0x%p\n",
170  (h->default_ref_list[1][i].long_ref ? "LT" : "ST"),
171  h->default_ref_list[1][i].pic_id,
172  h->default_ref_list[1][i].f.data[0]);
173  }
174  }
175 #endif
176  return 0;
177 }
178 
179 static void print_short_term(H264Context *h);
180 static void print_long_term(H264Context *h);
181 
182 /**
183  * Extract structure information about the picture described by pic_num in
184  * the current decoding context (frame or field). Note that pic_num is
185  * picture number without wrapping (so, 0<=pic_num<max_pic_num).
186  * @param pic_num picture number for which to extract structure information
187  * @param structure one of PICT_XXX describing structure of picture
188  * with pic_num
189  * @return frame number (short term) or long term index of picture
190  * described by pic_num
191  */
192 static int pic_num_extract(H264Context *h, int pic_num, int *structure)
193 {
194  *structure = h->picture_structure;
195  if (FIELD_PICTURE(h)) {
196  if (!(pic_num & 1))
197  /* opposite field */
198  *structure ^= PICT_FRAME;
199  pic_num >>= 1;
200  }
201 
202  return pic_num;
203 }
204 
206 {
207  int list, index, pic_structure, i;
208 
209  print_short_term(h);
210  print_long_term(h);
211 
212  for (list = 0; list < h->list_count; list++) {
213  for (i = 0; i < h->ref_count[list]; i++)
214  COPY_PICTURE(&h->ref_list[list][i], &h->default_ref_list[list][i]);
215 
216  if (get_bits1(&h->gb)) {
217  int pred = h->curr_pic_num;
218 
219  for (index = 0; ; index++) {
220  unsigned int reordering_of_pic_nums_idc = get_ue_golomb_31(&h->gb);
221  unsigned int pic_id;
222  int i;
223  Picture *ref = NULL;
224 
225  if (reordering_of_pic_nums_idc == 3)
226  break;
227 
228  if (index >= h->ref_count[list]) {
229  av_log(h->avctx, AV_LOG_ERROR, "reference count overflow\n");
230  return -1;
231  }
232 
233  if (reordering_of_pic_nums_idc < 3) {
234  if (reordering_of_pic_nums_idc < 2) {
235  const unsigned int abs_diff_pic_num = get_ue_golomb(&h->gb) + 1;
236  int frame_num;
237 
238  if (abs_diff_pic_num > h->max_pic_num) {
239  av_log(h->avctx, AV_LOG_ERROR, "abs_diff_pic_num overflow\n");
240  return -1;
241  }
242 
243  if (reordering_of_pic_nums_idc == 0)
244  pred -= abs_diff_pic_num;
245  else
246  pred += abs_diff_pic_num;
247  pred &= h->max_pic_num - 1;
248 
249  frame_num = pic_num_extract(h, pred, &pic_structure);
250 
251  for (i = h->short_ref_count - 1; i >= 0; i--) {
252  ref = h->short_ref[i];
253  assert(ref->reference);
254  assert(!ref->long_ref);
255  if (ref->frame_num == frame_num &&
256  (ref->reference & pic_structure))
257  break;
258  }
259  if (i >= 0)
260  ref->pic_id = pred;
261  } else {
262  int long_idx;
263  pic_id = get_ue_golomb(&h->gb); //long_term_pic_idx
264 
265  long_idx = pic_num_extract(h, pic_id, &pic_structure);
266 
267  if (long_idx > 31) {
268  av_log(h->avctx, AV_LOG_ERROR, "long_term_pic_idx overflow\n");
269  return -1;
270  }
271  ref = h->long_ref[long_idx];
272  assert(!(ref && !ref->reference));
273  if (ref && (ref->reference & pic_structure)) {
274  ref->pic_id = pic_id;
275  assert(ref->long_ref);
276  i = 0;
277  } else {
278  i = -1;
279  }
280  }
281 
282  if (i < 0) {
283  av_log(h->avctx, AV_LOG_ERROR, "reference picture missing during reorder\n");
284  memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME
285  } else {
286  for (i = index; i + 1 < h->ref_count[list]; i++) {
287  if (ref->long_ref == h->ref_list[list][i].long_ref &&
288  ref->pic_id == h->ref_list[list][i].pic_id)
289  break;
290  }
291  for (; i > index; i--) {
292  COPY_PICTURE(&h->ref_list[list][i], &h->ref_list[list][i - 1]);
293  }
294  COPY_PICTURE(&h->ref_list[list][index], ref);
295  if (FIELD_PICTURE(h)) {
296  pic_as_field(&h->ref_list[list][index], pic_structure);
297  }
298  }
299  } else {
300  av_log(h->avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idc\n");
301  return -1;
302  }
303  }
304  }
305  }
306  for (list = 0; list < h->list_count; list++) {
307  for (index = 0; index < h->ref_count[list]; index++) {
308  if ( !h->ref_list[list][index].f.data[0]
309  || (!FIELD_PICTURE(h) && (h->ref_list[list][index].reference&3) != 3)) {
310  int i;
311  av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture, default is %d\n", h->default_ref_list[list][0].poc);
312  for (i = 0; i < FF_ARRAY_ELEMS(h->last_pocs); i++)
313  h->last_pocs[i] = INT_MIN;
314  if (h->default_ref_list[list][0].f.data[0]
315  && !(!FIELD_PICTURE(h) && (h->default_ref_list[list][0].reference&3) != 3))
316  COPY_PICTURE(&h->ref_list[list][index], &h->default_ref_list[list][0]);
317  else
318  return -1;
319  }
320  av_assert0(av_buffer_get_ref_count(h->ref_list[list][index].f.buf[0]) > 0);
321  }
322  }
323 
324  return 0;
325 }
326 
328 {
329  int list, i, j;
330  for (list = 0; list < h->list_count; list++) {
331  for (i = 0; i < h->ref_count[list]; i++) {
332  Picture *frame = &h->ref_list[list][i];
333  Picture *field = &h->ref_list[list][16 + 2 * i];
334  COPY_PICTURE(field, frame);
335  for (j = 0; j < 3; j++)
336  field[0].f.linesize[j] <<= 1;
337  field[0].reference = PICT_TOP_FIELD;
338  field[0].poc = field[0].field_poc[0];
339  COPY_PICTURE(field + 1, field);
340  for (j = 0; j < 3; j++)
341  field[1].f.data[j] += frame->f.linesize[j];
342  field[1].reference = PICT_BOTTOM_FIELD;
343  field[1].poc = field[1].field_poc[1];
344 
345  h->luma_weight[16 + 2 * i][list][0] = h->luma_weight[16 + 2 * i + 1][list][0] = h->luma_weight[i][list][0];
346  h->luma_weight[16 + 2 * i][list][1] = h->luma_weight[16 + 2 * i + 1][list][1] = h->luma_weight[i][list][1];
347  for (j = 0; j < 2; j++) {
348  h->chroma_weight[16 + 2 * i][list][j][0] = h->chroma_weight[16 + 2 * i + 1][list][j][0] = h->chroma_weight[i][list][j][0];
349  h->chroma_weight[16 + 2 * i][list][j][1] = h->chroma_weight[16 + 2 * i + 1][list][j][1] = h->chroma_weight[i][list][j][1];
350  }
351  }
352  }
353 }
354 
355 /**
356  * Mark a picture as no longer needed for reference. The refmask
357  * argument allows unreferencing of individual fields or the whole frame.
358  * If the picture becomes entirely unreferenced, but is being held for
359  * display purposes, it is marked as such.
360  * @param refmask mask of fields to unreference; the mask is bitwise
361  * anded with the reference marking of pic
362  * @return non-zero if pic becomes entirely unreferenced (except possibly
363  * for display purposes) zero if one of the fields remains in
364  * reference
365  */
366 static inline int unreference_pic(H264Context *h, Picture *pic, int refmask)
367 {
368  int i;
369  if (pic->reference &= refmask) {
370  return 0;
371  } else {
372  for(i = 0; h->delayed_pic[i]; i++)
373  if(pic == h->delayed_pic[i]){
374  pic->reference = DELAYED_PIC_REF;
375  break;
376  }
377  return 1;
378  }
379 }
380 
381 /**
382  * Find a Picture in the short term reference list by frame number.
383  * @param frame_num frame number to search for
384  * @param idx the index into h->short_ref where returned picture is found
385  * undefined if no picture found.
386  * @return pointer to the found picture, or NULL if no pic with the provided
387  * frame number is found
388  */
389 static Picture *find_short(H264Context *h, int frame_num, int *idx)
390 {
391  int i;
392 
393  for (i = 0; i < h->short_ref_count; i++) {
394  Picture *pic = h->short_ref[i];
395  if (h->avctx->debug & FF_DEBUG_MMCO)
396  av_log(h->avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic);
397  if (pic->frame_num == frame_num) {
398  *idx = i;
399  return pic;
400  }
401  }
402  return NULL;
403 }
404 
405 /**
406  * Remove a picture from the short term reference list by its index in
407  * that list. This does no checking on the provided index; it is assumed
408  * to be valid. Other list entries are shifted down.
409  * @param i index into h->short_ref of picture to remove.
410  */
411 static void remove_short_at_index(H264Context *h, int i)
412 {
413  assert(i >= 0 && i < h->short_ref_count);
414  h->short_ref[i] = NULL;
415  if (--h->short_ref_count)
416  memmove(&h->short_ref[i], &h->short_ref[i + 1],
417  (h->short_ref_count - i) * sizeof(Picture*));
418 }
419 
420 /**
421  *
422  * @return the removed picture or NULL if an error occurs
423  */
424 static Picture *remove_short(H264Context *h, int frame_num, int ref_mask)
425 {
426  Picture *pic;
427  int i;
428 
429  if (h->avctx->debug & FF_DEBUG_MMCO)
430  av_log(h->avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count);
431 
432  pic = find_short(h, frame_num, &i);
433  if (pic) {
434  if (unreference_pic(h, pic, ref_mask))
435  remove_short_at_index(h, i);
436  }
437 
438  return pic;
439 }
440 
441 /**
442  * Remove a picture from the long term reference list by its index in
443  * that list.
444  * @return the removed picture or NULL if an error occurs
445  */
446 static Picture *remove_long(H264Context *h, int i, int ref_mask)
447 {
448  Picture *pic;
449 
450  pic = h->long_ref[i];
451  if (pic) {
452  if (unreference_pic(h, pic, ref_mask)) {
453  assert(h->long_ref[i]->long_ref == 1);
454  h->long_ref[i]->long_ref = 0;
455  h->long_ref[i] = NULL;
456  h->long_ref_count--;
457  }
458  }
459 
460  return pic;
461 }
462 
464 {
465  int i;
466 
467  for (i = 0; i < 16; i++) {
468  remove_long(h, i, 0);
469  }
470  assert(h->long_ref_count == 0);
471 
472  for (i = 0; i < h->short_ref_count; i++) {
473  unreference_pic(h, h->short_ref[i], 0);
474  h->short_ref[i] = NULL;
475  }
476  h->short_ref_count = 0;
477 
478  memset(h->default_ref_list, 0, sizeof(h->default_ref_list));
479  memset(h->ref_list, 0, sizeof(h->ref_list));
480 }
481 
482 /**
483  * print short term list
484  */
486 {
487  uint32_t i;
488  if (h->avctx->debug & FF_DEBUG_MMCO) {
489  av_log(h->avctx, AV_LOG_DEBUG, "short term list:\n");
490  for (i = 0; i < h->short_ref_count; i++) {
491  Picture *pic = h->short_ref[i];
492  av_log(h->avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n",
493  i, pic->frame_num, pic->poc, pic->f.data[0]);
494  }
495  }
496 }
497 
498 /**
499  * print long term list
500  */
502 {
503  uint32_t i;
504  if (h->avctx->debug & FF_DEBUG_MMCO) {
505  av_log(h->avctx, AV_LOG_DEBUG, "long term list:\n");
506  for (i = 0; i < 16; i++) {
507  Picture *pic = h->long_ref[i];
508  if (pic) {
509  av_log(h->avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n",
510  i, pic->frame_num, pic->poc, pic->f.data[0]);
511  }
512  }
513  }
514 }
515 
516 static int check_opcodes(MMCO *mmco1, MMCO *mmco2, int n_mmcos)
517 {
518  int i;
519 
520  for (i = 0; i < n_mmcos; i++) {
521  if (mmco1[i].opcode != mmco2[i].opcode) {
522  av_log(NULL, AV_LOG_ERROR, "MMCO opcode [%d, %d] at %d mismatches between slices\n",
523  mmco1[i].opcode, mmco2[i].opcode, i);
524  return -1;
525  }
526  }
527 
528  return 0;
529 }
530 
532 {
533  MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp;
534  int mmco_index = 0, i;
535 
536  if (h->short_ref_count &&
538  !(FIELD_PICTURE(h) && !h->first_field && h->cur_pic_ptr->reference)) {
539  mmco[0].opcode = MMCO_SHORT2UNUSED;
540  mmco[0].short_pic_num = h->short_ref[h->short_ref_count - 1]->frame_num;
541  mmco_index = 1;
542  if (FIELD_PICTURE(h)) {
543  mmco[0].short_pic_num *= 2;
544  mmco[1].opcode = MMCO_SHORT2UNUSED;
545  mmco[1].short_pic_num = mmco[0].short_pic_num + 1;
546  mmco_index = 2;
547  }
548  }
549 
550  if (first_slice) {
551  h->mmco_index = mmco_index;
552  } else if (!first_slice && mmco_index >= 0 &&
553  (mmco_index != h->mmco_index ||
554  (i = check_opcodes(h->mmco, mmco_temp, mmco_index)))) {
556  "Inconsistent MMCO state between slices [%d, %d]\n",
557  mmco_index, h->mmco_index);
558  return AVERROR_INVALIDDATA;
559  }
560  return 0;
561 }
562 
563 int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count)
564 {
565  int i, av_uninit(j);
566  int current_ref_assigned = 0, err = 0;
567  Picture *av_uninit(pic);
568 
569  if ((h->avctx->debug & FF_DEBUG_MMCO) && mmco_count == 0)
570  av_log(h->avctx, AV_LOG_DEBUG, "no mmco here\n");
571 
572  for (i = 0; i < mmco_count; i++) {
573  int av_uninit(structure), av_uninit(frame_num);
574  if (h->avctx->debug & FF_DEBUG_MMCO)
575  av_log(h->avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode,
576  h->mmco[i].short_pic_num, h->mmco[i].long_arg);
577 
578  if (mmco[i].opcode == MMCO_SHORT2UNUSED ||
579  mmco[i].opcode == MMCO_SHORT2LONG) {
580  frame_num = pic_num_extract(h, mmco[i].short_pic_num, &structure);
581  pic = find_short(h, frame_num, &j);
582  if (!pic) {
583  if (mmco[i].opcode != MMCO_SHORT2LONG ||
584  !h->long_ref[mmco[i].long_arg] ||
585  h->long_ref[mmco[i].long_arg]->frame_num != frame_num) {
586  av_log(h->avctx, AV_LOG_ERROR, "mmco: unref short failure\n");
587  err = AVERROR_INVALIDDATA;
588  }
589  continue;
590  }
591  }
592 
593  switch (mmco[i].opcode) {
594  case MMCO_SHORT2UNUSED:
595  if (h->avctx->debug & FF_DEBUG_MMCO)
596  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n",
598  remove_short(h, frame_num, structure ^ PICT_FRAME);
599  break;
600  case MMCO_SHORT2LONG:
601  if (h->long_ref[mmco[i].long_arg] != pic)
602  remove_long(h, mmco[i].long_arg, 0);
603 
604  remove_short_at_index(h, j);
605  h->long_ref[ mmco[i].long_arg ] = pic;
606  if (h->long_ref[mmco[i].long_arg]) {
607  h->long_ref[mmco[i].long_arg]->long_ref = 1;
608  h->long_ref_count++;
609  }
610  break;
611  case MMCO_LONG2UNUSED:
612  j = pic_num_extract(h, mmco[i].long_arg, &structure);
613  pic = h->long_ref[j];
614  if (pic) {
615  remove_long(h, j, structure ^ PICT_FRAME);
616  } else if (h->avctx->debug & FF_DEBUG_MMCO)
617  av_log(h->avctx, AV_LOG_DEBUG, "mmco: unref long failure\n");
618  break;
619  case MMCO_LONG:
620  // Comment below left from previous code as it is an interresting note.
621  /* First field in pair is in short term list or
622  * at a different long term index.
623  * This is not allowed; see 7.4.3.3, notes 2 and 3.
624  * Report the problem and keep the pair where it is,
625  * and mark this field valid.
626  */
627 
628  if (h->long_ref[mmco[i].long_arg] != h->cur_pic_ptr) {
629  if (h->cur_pic_ptr->long_ref) {
630  for(j=0; j<16; j++) {
631  if(h->long_ref[j] == h->cur_pic_ptr) {
632  remove_long(h, j, 0);
633  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to 2 long term references\n");
634  }
635  }
636  }
638  remove_long(h, mmco[i].long_arg, 0);
639  if (remove_short(h, h->cur_pic_ptr->frame_num, 0)) {
640  av_log(h->avctx, AV_LOG_ERROR, "mmco: cannot assign current picture to short and long at the same time\n");
641  }
642 
643  h->long_ref[mmco[i].long_arg] = h->cur_pic_ptr;
644  h->long_ref[mmco[i].long_arg]->long_ref = 1;
645  h->long_ref_count++;
646  }
647 
649  current_ref_assigned = 1;
650  break;
651  case MMCO_SET_MAX_LONG:
652  assert(mmco[i].long_arg <= 16);
653  // just remove the long term which index is greater than new max
654  for (j = mmco[i].long_arg; j < 16; j++) {
655  remove_long(h, j, 0);
656  }
657  break;
658  case MMCO_RESET:
659  while (h->short_ref_count) {
660  remove_short(h, h->short_ref[0]->frame_num, 0);
661  }
662  for (j = 0; j < 16; j++) {
663  remove_long(h, j, 0);
664  }
665  h->frame_num = h->cur_pic_ptr->frame_num = 0;
666  h->mmco_reset = 1;
667  h->cur_pic_ptr->mmco_reset = 1;
668  for (j = 0; j < MAX_DELAYED_PIC_COUNT; j++)
669  h->last_pocs[j] = INT_MIN;
670  break;
671  default: assert(0);
672  }
673  }
674 
675  if (!current_ref_assigned) {
676  /* Second field of complementary field pair; the first field of
677  * which is already referenced. If short referenced, it
678  * should be first entry in short_ref. If not, it must exist
679  * in long_ref; trying to put it on the short list here is an
680  * error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3).
681  */
682  if (h->short_ref_count && h->short_ref[0] == h->cur_pic_ptr) {
683  /* Just mark the second field valid */
685  } else if (h->cur_pic_ptr->long_ref) {
686  av_log(h->avctx, AV_LOG_ERROR, "illegal short term reference "
687  "assignment for second field "
688  "in complementary field pair "
689  "(first field is long term)\n");
690  err = AVERROR_INVALIDDATA;
691  } else {
692  pic = remove_short(h, h->cur_pic_ptr->frame_num, 0);
693  if (pic) {
694  av_log(h->avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n");
695  err = AVERROR_INVALIDDATA;
696  }
697 
698  if (h->short_ref_count)
699  memmove(&h->short_ref[1], &h->short_ref[0],
700  h->short_ref_count * sizeof(Picture*));
701 
702  h->short_ref[0] = h->cur_pic_ptr;
703  h->short_ref_count++;
705  }
706  }
707 
708  if (h->long_ref_count + h->short_ref_count > FFMAX(h->sps.ref_frame_count, 1)) {
709 
710  /* We have too many reference frames, probably due to corrupted
711  * stream. Need to discard one frame. Prevents overrun of the
712  * short_ref and long_ref buffers.
713  */
715  "number of reference frames (%d+%d) exceeds max (%d; probably "
716  "corrupt input), discarding one\n",
718  err = AVERROR_INVALIDDATA;
719 
720  if (h->long_ref_count && !h->short_ref_count) {
721  for (i = 0; i < 16; ++i)
722  if (h->long_ref[i])
723  break;
724 
725  assert(i < 16);
726  remove_long(h, i, 0);
727  } else {
728  pic = h->short_ref[h->short_ref_count - 1];
729  remove_short(h, pic->frame_num, 0);
730  }
731  }
732 
733  print_short_term(h);
734  print_long_term(h);
735 
736  if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=1 + (h->picture_structure != PICT_FRAME) && h->cur_pic_ptr->f.pict_type == AV_PICTURE_TYPE_I){
737  h->cur_pic_ptr->sync |= 1;
738  if(!h->avctx->has_b_frames)
739  h->sync = 2;
740  }
741 
742  return (h->avctx->err_recognition & AV_EF_EXPLODE) ? err : 0;
743 }
744 
746  int first_slice)
747 {
748  int i, ret;
749  MMCO mmco_temp[MAX_MMCO_COUNT], *mmco = first_slice ? h->mmco : mmco_temp;
750  int mmco_index = 0;
751 
752  if (h->nal_unit_type == NAL_IDR_SLICE) { // FIXME fields
753  skip_bits1(gb); // broken_link
754  if (get_bits1(gb)) {
755  mmco[0].opcode = MMCO_LONG;
756  mmco[0].long_arg = 0;
757  mmco_index = 1;
758  }
759  } else {
760  if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag
761  for (i = 0; i < MAX_MMCO_COUNT; i++) {
762  MMCOOpcode opcode = get_ue_golomb_31(gb);
763 
764  mmco[i].opcode = opcode;
765  if (opcode == MMCO_SHORT2UNUSED || opcode == MMCO_SHORT2LONG) {
766  mmco[i].short_pic_num =
767  (h->curr_pic_num - get_ue_golomb(gb) - 1) &
768  (h->max_pic_num - 1);
769 #if 0
770  if (mmco[i].short_pic_num >= h->short_ref_count ||
771  h->short_ref[ mmco[i].short_pic_num ] == NULL){
772  av_log(s->avctx, AV_LOG_ERROR,
773  "illegal short ref in memory management control "
774  "operation %d\n", mmco);
775  return -1;
776  }
777 #endif
778  }
779  if (opcode == MMCO_SHORT2LONG || opcode == MMCO_LONG2UNUSED ||
780  opcode == MMCO_LONG || opcode == MMCO_SET_MAX_LONG) {
781  unsigned int long_arg = get_ue_golomb_31(gb);
782  if (long_arg >= 32 ||
783  (long_arg >= 16 && !(opcode == MMCO_SET_MAX_LONG &&
784  long_arg == 16) &&
785  !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE(h)))) {
787  "illegal long ref in memory management control "
788  "operation %d\n", opcode);
789  return -1;
790  }
791  mmco[i].long_arg = long_arg;
792  }
793 
794  if (opcode > (unsigned) MMCO_LONG) {
796  "illegal memory management control operation %d\n",
797  opcode);
798  return -1;
799  }
800  if (opcode == MMCO_END)
801  break;
802  }
803  mmco_index = i;
804  } else {
805  if (first_slice) {
806  ret = ff_generate_sliding_window_mmcos(h, first_slice);
807  if (ret < 0 && h->avctx->err_recognition & AV_EF_EXPLODE)
808  return ret;
809  }
810  mmco_index = -1;
811  }
812  }
813 
814  if (first_slice && mmco_index != -1) {
815  h->mmco_index = mmco_index;
816  } else if (!first_slice && mmco_index >= 0 &&
817  (mmco_index != h->mmco_index ||
818  (i = check_opcodes(h->mmco, mmco_temp, mmco_index)))) {
820  "Inconsistent MMCO state between slices [%d, %d]\n",
821  mmco_index, h->mmco_index);
822  return AVERROR_INVALIDDATA;
823  }
824 
825  return 0;
826 }
Picture default_ref_list[2][32]
base reference list for all slices of a coded picture
Definition: h264.h:526
#define PICT_BOTTOM_FIELD
Definition: mpegvideo.h:663
Memory management control operation.
Definition: h264.h:251
static int pic_num_extract(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:192
#define PICT_TOP_FIELD
Definition: mpegvideo.h:662
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
GetBitContext gb
Definition: h264.h:268
FIXME Range Coding of cr are ref
Definition: snow.txt:367
int first_field
Definition: h264.h:383
int sync
did we had a keyframe or recovery point
Definition: h264.h:643
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:343
static int check_opcodes(MMCO *mmco1, MMCO *mmco2, int n_mmcos)
Definition: h264_refs.c:516
#define FF_DEBUG_MMCO
MMCO mmco[MAX_MMCO_COUNT]
memory management control operations buffer.
Definition: h264.h:538
int ff_h264_fill_default_ref_list(H264Context *h)
Fill the default_ref_list.
Definition: h264_refs.c:117
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
Definition: h264.h:219
#define DELAYED_PIC_REF
Value of Picture.reference when Picture is not a reference picture, but is held for delayed output...
Sinusoidal phase f
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
void ff_h264_fill_mbaff_ref_list(H264Context *h)
Definition: h264_refs.c:327
int mmco_index
Definition: h264.h:539
int ff_h264_decode_ref_pic_list_reordering(H264Context *h)
Definition: h264_refs.c:205
MMCOOpcode
Memory management control operation opcode.
Definition: h264.h:238
#define FF_ARRAY_ELEMS(a)
H264Context.
Definition: h264.h:260
int mmco_reset
h264 MMCO_RESET set this 1. Reordering code must not mix pictures before and after MMCO_RESET...
Definition: mpegvideo.h:162
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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
int picture_structure
Definition: h264.h:382
int slice_type_nos
S free slice type (SI/SP are remapped to I/P)
Definition: h264.h:375
MMCOOpcode opcode
Definition: h264.h:252
void ff_h264_remove_all_refs(H264Context *h)
Definition: h264_refs.c:463
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
int long_ref
1->long term reference 0->short term reference
Definition: mpegvideo.h:165
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int short_pic_num
pic_num without wrapping (pic_num & max_pic_num)
Definition: h264.h:253
#define PICT_FRAME
Definition: mpegvideo.h:664
int luma_weight[48][2][2]
Definition: h264.h:393
Picture ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs.
Definition: h264.h:411
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
Definition: h264.h:408
int ff_h264_decode_ref_pic_marking(H264Context *h, GetBitContext *gb, int first_slice)
Definition: h264_refs.c:745
#define MAX_DELAYED_PIC_COUNT
Definition: h264.h:47
int ff_generate_sliding_window_mmcos(H264Context *h, int first_slice)
Definition: h264_refs.c:531
int chroma_weight[48][2][2][2]
Definition: h264.h:394
int last_pocs[MAX_DELAYED_PIC_COUNT]
Definition: h264.h:530
frame
Definition: stft.m:14
H.264 / AVC / MPEG4 part10 codec.
int frame_num
Definition: h264.h:507
int has_b_frames
Size of the frame reordering buffer in the decoder.
static int get_ue_golomb(GetBitContext *gb)
read unsigned exp golomb code.
Definition: golomb.h:53
#define AV_EF_EXPLODE
int nal_unit_type
Definition: h264.h:481
Picture * delayed_pic[MAX_DELAYED_PIC_COUNT+2]
Definition: h264.h:529
int reference
Definition: mpegvideo.h:178
PPS pps
current pps
Definition: h264.h:365
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
#define COPY_PICTURE(dst, src)
Definition: h264_refs.c:37
static void pic_as_field(Picture *pic, const int parity)
Definition: h264_refs.c:45
#define FFMAX(a, b)
Definition: common.h:56
external API header
static int add_sorted(Picture **sorted, Picture **src, int len, int limit, int dir)
Definition: h264_refs.c:95
int ref_frame_count
num_ref_frames
Definition: h264.h:163
Picture * long_ref[32]
Definition: h264.h:528
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
int poc
h264 frame POC
Definition: mpegvideo.h:160
#define FIELD_PICTURE(h)
Definition: h264.h:67
ret
Definition: avfilter.c:821
static Picture * remove_short(H264Context *h, int frame_num, int ref_mask)
Definition: h264_refs.c:424
int long_ref_count
number of actual long term references
Definition: h264.h:542
Picture.
Definition: mpegvideo.h:97
SPS sps
current sps
Definition: h264.h:360
int frame_num
h264 frame_num (raw frame_num from slice header)
Definition: mpegvideo.h:161
int mmco_reset
Definition: h264.h:540
int max_pic_num
max_frame_num or 2 * max_frame_num for field pics.
Definition: h264.h:522
int curr_pic_num
frame_num for frames or 2 * frame_num + 1 for field pics.
Definition: h264.h:517
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:411
unsigned int list_count
Definition: h264.h:409
static const float pred[4]
Definition: siprdata.h:259
NULL
Definition: eval.c:55
dest
Definition: start.py:60
AVCodecContext * avctx
Definition: h264.h:261
int sync
has been decoded after a keyframe
Definition: mpegvideo.h:170
int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count)
Execute the reference picture marking (memory management control operations).
Definition: h264_refs.c:563
AVS_Value src
Definition: avisynth_c.h:523
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition: golomb.h:100
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
Definition: h264.h:239
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
int av_buffer_get_ref_count(const AVBufferRef *buf)
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:298
Picture * short_ref[32]
Definition: h264.h:527
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
#define MAX_MMCO_COUNT
Definition: h264.h:45
static int split_field_copy(Picture *dest, Picture *src, int parity, int id_add)
Definition: h264_refs.c:56
static Picture * find_short(H264Context *h, int frame_num, int *idx)
Find a Picture in the short term reference list by frame number.
Definition: h264_refs.c:389
int field_poc[2]
h264 top/bottom POC
Definition: mpegvideo.h:159
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
#define tprintf(p,...)
Definition: get_bits.h:628
common internal api header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
static Picture * 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:446
Bi-dir predicted.
Definition: avutil.h:218
int long_arg
index, pic_num, or num long refs depending on opcode
Definition: h264.h:254
Picture * cur_pic_ptr
Definition: h264.h:273
int len
int pic_id
h264 pic_num (short -> no wrap version of pic_num, pic_num & max_pic_num; long -> long_pic_num) ...
Definition: mpegvideo.h:163
static void print_long_term(H264Context *h)
print long term list
Definition: h264_refs.c:501
struct AVFrame f
Definition: mpegvideo.h:98
#define av_uninit(x)
Definition: attributes.h:137
p parity
Definition: vf_mcdeint.c:178
static int unreference_pic(H264Context *h, Picture *pic, int refmask)
Mark a picture as no longer needed for reference.
Definition: h264_refs.c:366
exp golomb vlc stuff
static void print_short_term(H264Context *h)
print short term list
Definition: h264_refs.c:485
for(j=16;j >0;--j)
static int build_def_list(Picture *def, Picture **in, int len, int is_long, int sel)
Definition: h264_refs.c:72
int short_ref_count
number of actual short term references
Definition: h264.h:543