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
36
37 #include <assert.h>
38
40 {
47 }
49 }
50
52 {
59 }
60
62 {
64
65 if (match) {
71 }
72 }
73
74 return match;
75 }
76
79 {
82
84 while (
i[0] <
len && !(in[
i[0]] && (in[
i[0]]->reference & sel)))
86 while (
i[1] <
len && !(in[
i[1]] && (in[
i[1]]->reference & (sel ^ 3))))
92 }
97 }
98 }
99
101 }
102
105 {
107 int out_i = 0;
108
109 for (;;) {
110 best_poc = dir ? INT_MIN : INT_MAX;
111
112 for (
i = 0;
i <
len;
i++) {
113 const int poc =
src[
i]->poc;
114 if (((poc >
limit) ^ dir) && ((poc < best_poc) ^ dir)) {
115 best_poc = poc;
116 sorted[out_i] =
src[
i];
117 }
118 }
119 if (best_poc == (dir ? INT_MIN : INT_MAX))
120 break;
122 }
123 return out_i;
124 }
125
127 {
129 return (
h->cur_pic_ptr->f->width !=
f->width ||
130 h->cur_pic_ptr->f->height !=
f->height ||
131 h->cur_pic_ptr->f->format !=
f->format);
132 }
133
135 {
137 int j;
138
142 int lens[2];
143
146 else
147 cur_poc =
h->cur_pic_ptr->poc;
148
153
155 sorted,
len, 0,
h->picture_structure);
158 h->long_ref, 16, 1,
h->picture_structure);
160
161 if (len < sl->ref_count[
list])
164 }
165
166 if (lens[0] == lens[1] && lens[1] > 1) {
167 for (
i = 0;
i < lens[0] &&
172 }
173 }
174 } else {
176 h->short_ref,
h->short_ref_count, 0,
h->picture_structure);
179 h-> long_ref, 16, 1,
h->picture_structure);
181
182 if (len < sl->ref_count[0])
184 }
185 #ifdef TRACE
187 ff_tlog(
h->avctx,
"List0: %s fn:%d 0x%p\n",
191 }
194 ff_tlog(
h->avctx,
"List1: %s fn:%d 0x%p\n",
198 }
199 }
200 #endif
201
208 }
209 }
210 }
211 }
214 }
215
216 /**
217 * print short term list
218 */
220 {
224 for (
i = 0;
i <
h->short_ref_count;
i++) {
228 }
229 }
230 }
231
232 /**
233 * print long term list
234 */
236 {
240 for (
i = 0;
i < 16;
i++) {
242 if (pic) {
245 }
246 }
247 }
248 }
249
250 /**
251 * Extract structure information about the picture described by pic_num in
252 * the current decoding context (frame or field). Note that pic_num is
253 * picture number without wrapping (so, 0<=pic_num<max_pic_num).
254 * @param pic_num picture number for which to extract structure information
255 * @param structure one of PICT_XXX describing structure of picture
256 * with pic_num
257 * @return frame number (short term) or long term index of picture
258 * described by pic_num
259 */
261 {
262 *structure =
h->picture_structure;
264 if (!(pic_num & 1))
265 /* opposite field */
267 pic_num >>= 1;
268 }
269
270 return pic_num;
271 }
272
274 {
280
282
283 for (j = 0; j < 3; j++)
284 field[0].linesize[j] <<= 1;
287
289
290 for (j = 0; j < 3; j++)
294 }
295 }
296 }
297
299 {
301
304
306
309
313 unsigned int pic_id;
316
317 switch (modification_of_pic_nums_idc) {
318 case 0:
319 case 1: {
320 const unsigned int abs_diff_pic_num =
val + 1;
321 int frame_num;
322
325 "abs_diff_pic_num overflow\n");
327 }
328
329 if (modification_of_pic_nums_idc == 0)
330 pred -= abs_diff_pic_num;
331 else
332 pred += abs_diff_pic_num;
334
336
337 for (
i =
h->short_ref_count - 1;
i >= 0;
i--) {
338 ref =
h->short_ref[
i];
339 assert(
ref->reference);
340 assert(!
ref->long_ref);
341 if (
ref->frame_num == frame_num &&
342 (
ref->reference & pic_structure))
343 break;
344 }
347 break;
348 }
349 case 2: {
350 int long_idx;
351 pic_id =
val;
// long_term_pic_idx
352
354
355 if (long_idx > 31
U) {
357 "long_term_pic_idx overflow\n");
359 }
360 ref =
h->long_ref[long_idx];
361 assert(!(
ref && !
ref->reference));
362 if (
ref && (
ref->reference & pic_structure)) {
363 ref->pic_id = pic_id;
364 assert(
ref->long_ref);
366 } else {
368 }
369 break;
370 }
371 default:
373 }
374
377 i < 0 ?
"reference picture missing during reorder\n" :
378 "mismatching reference\n"
379 );
381 } else {
386 break;
387 }
390 }
394 }
395 }
396 }
397 }
405 h->last_pocs[
i] = INT_MIN;
406 if (
h->default_ref[
list].parent
409 else
410 return -1;
411 }
413 }
414 }
415
418
419 return 0;
420 }
421
423 {
425
428
430 if (!
get_bits1(&sl->
gb))
// ref_pic_list_modification_flag_l[01]
431 continue;
432
435
437 break;
438
444 "illegal modification_of_pic_nums_idc %u\n",
447 }
451 }
452 }
453
454 return 0;
455 }
456
457 /**
458 * Mark a picture as no longer needed for reference. The refmask
459 * argument allows unreferencing of individual fields or the whole frame.
460 * If the picture becomes entirely unreferenced, but is being held for
461 * display purposes, it is marked as such.
462 * @param refmask mask of fields to unreference; the mask is bitwise
463 * anded with the reference marking of pic
464 * @return non-zero if pic becomes entirely unreferenced (except possibly
465 * for display purposes) zero if one of the fields remains in
466 * reference
467 */
469 {
472 return 0;
473 } else {
474 for(
i = 0;
h->delayed_pic[
i];
i++)
475 if(pic ==
h->delayed_pic[
i]){
477 break;
478 }
479 return 1;
480 }
481 }
482
483 /**
484 * Find a H264Picture in the short term reference list by frame number.
485 * @param frame_num frame number to search for
486 * @param idx the index into h->short_ref where returned picture is found
487 * undefined if no picture found.
488 * @return pointer to the found picture, or NULL if no pic with the provided
489 * frame number is found
490 */
492 {
494
495 for (
i = 0;
i <
h->short_ref_count;
i++) {
501 return pic;
502 }
503 }
505 }
506
507 /**
508 * Remove a picture from the short term reference list by its index in
509 * that list. This does no checking on the provided index; it is assumed
510 * to be valid. Other list entries are shifted down.
511 * @param i index into h->short_ref of picture to remove.
512 */
514 {
515 assert(
i >= 0 && i < h->short_ref_count);
517 if (--
h->short_ref_count)
518 memmove(&
h->short_ref[
i], &
h->short_ref[
i + 1],
520 }
521
522 /**
523 * @return the removed picture or NULL if an error occurs
524 */
526 {
529
532
534 if (pic) {
537 }
538
539 return pic;
540 }
541
542 /**
543 * Remove a picture from the long term reference list by its index in
544 * that list.
545 * @return the removed picture or NULL if an error occurs
546 */
548 {
550
551 pic =
h->long_ref[
i];
552 if (pic) {
554 assert(
h->long_ref[
i]->long_ref == 1);
555 h->long_ref[
i]->long_ref = 0;
558 }
559 }
560
561 return pic;
562 }
563
565 {
567
568 for (
i = 0;
i < 16;
i++) {
570 }
571 assert(
h->long_ref_count == 0);
572
573 if (
h->short_ref_count && !
h->last_pic_for_ec.f->data[0]) {
576 }
577
578 for (
i = 0;
i <
h->short_ref_count;
i++) {
581 }
582 h->short_ref_count = 0;
583
584 memset(
h->default_ref, 0,
sizeof(
h->default_ref));
585 }
586
588 {
589 MMCO *mmco =
h->mmco;
590 int nb_mmco = 0;
591
592 if (
h->short_ref_count &&
593 h->long_ref_count +
h->short_ref_count >=
h->ps.sps->ref_frame_count &&
596 mmco[0].
short_pic_num =
h->short_ref[
h->short_ref_count - 1]->frame_num;
597 nb_mmco = 1;
602 nb_mmco = 2;
603 }
604 }
605
606 h->nb_mmco = nb_mmco;
607 }
608
610 {
611 MMCO *mmco =
h->mmco;
612 int mmco_count;
614 int pps_ref_count[2] = {0};
615 int current_ref_assigned = 0, err = 0;
617
622 }
623
624 if (!
h->explicit_ref_marking)
626 mmco_count =
h->nb_mmco;
627
630
631 for (
i = 0;
i < mmco_count;
i++) {
635 h->mmco[
i].short_pic_num,
h->mmco[
i].long_arg);
636
641 if (!pic) {
644 h->long_ref[mmco[
i].
long_arg]->frame_num != frame_num) {
647 }
648 continue;
649 }
650 }
651
652 switch (mmco[
i].opcode) {
656 h->mmco[
i].short_pic_num,
h->short_ref_count);
658 break;
662
668 }
669 break;
672 pic =
h->long_ref[j];
673 if (pic) {
677 break;
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) {
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");
698 }
699 }
700 }
701
702 if (
h->long_ref[mmco[
i].
long_arg] !=
h->cur_pic_ptr) {
705
709 }
710
711 h->cur_pic_ptr->reference |=
h->picture_structure;
712 current_ref_assigned = 1;
713 break;
715 assert(mmco[
i].long_arg <= 16);
716 // just remove the long term which index is greater than new max
717 for (j = mmco[
i].long_arg; j < 16; j++) {
719 }
720 break;
722 while (
h->short_ref_count) {
724 }
725 for (j = 0; j < 16; j++) {
727 }
728 h->poc.frame_num =
h->cur_pic_ptr->frame_num = 0;
730 h->cur_pic_ptr->mmco_reset = 1;
732 h->last_pocs[j] = INT_MIN;
733 break;
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) {
750 "assignment for second field "
751 "in complementary field pair "
752 "(first field is long term)\n");
754 } else {
756 if (pic) {
759 }
760
761 if (
h->short_ref_count)
762 memmove(&
h->short_ref[1], &
h->short_ref[0],
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 */
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);
782
783 if (
h->long_ref_count && !
h->short_ref_count) {
784 for (
i = 0;
i < 16; ++
i)
786 break;
787
790 } else {
791 pic =
h->short_ref[
h->short_ref_count - 1];
793 }
794 }
795
796 for (
i = 0;
i<
h->short_ref_count;
i++) {
797 pic =
h->short_ref[
i];
798 if (pic->invalid_gap) {
799 int d =
av_mod_uintp2(
h->cur_pic_ptr->frame_num - pic->frame_num,
h->ps.sps->log2_max_frame_num);
800 if (
d >
h->ps.sps->ref_frame_count)
802 }
803 }
804
807
809 if (
h->ps.pps_list[
i]) {
810 const PPS *
pps = (
const PPS *)
h->ps.pps_list[
i]->data;
811 pps_ref_count[0] =
FFMAX(pps_ref_count[0],
pps->ref_count[0]);
812 pps_ref_count[1] =
FFMAX(pps_ref_count[1],
pps->ref_count[1]);
813 }
814 }
815
816 // Detect unmarked random access points
817 if ( err >= 0
818 &&
h->long_ref_count==0
819 && (
h->short_ref_count<=2
820 || pps_ref_count[0] <= 2 && pps_ref_count[1] <= 1 &&
h->avctx->has_b_frames
821 || pps_ref_count[0] <= 1 + (
h->picture_structure !=
PICT_FRAME) && pps_ref_count[1] <= 1)
822 && pps_ref_count[0]<=2 + (
h->picture_structure !=
PICT_FRAME) + (2*!
h->has_recovery_point)
824 h->cur_pic_ptr->recovered |= 1;
825 if(!
h->avctx->has_b_frames)
827 }
828
831 }
832
835 {
838 int nb_mmco = 0;
839
845 nb_mmco = 1;
846 }
848 } else {
853
859 }
863 if (long_arg >= 32 ||
865 long_arg == 16) &&
868 "illegal long ref in memory management control "
869 "operation %d\n", opcode);
871 return -1;
872 }
874 }
875
878 "illegal memory management control operation %d\n",
879 opcode);
881 return -1;
882 }
884 break;
885 }
887 }
888 }
889
891
892 return 0;
893 }