00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <limits.h>
00018
00019 #include "global.h"
00020 #include "mbuffer.h"
00021 #include "memalloc.h"
00022 #include "output.h"
00023 #include "image.h"
00024 #include "nalucommon.h"
00025
00026 extern void init_stats (StatParameters *stats);
00027 static void insert_picture_in_dpb(FrameStore* fs, StorablePicture* p);
00028 static void output_one_frame_from_dpb(void);
00029 static int is_used_for_reference(FrameStore* fs);
00030 static void get_smallest_poc(int *poc,int * pos);
00031 static int remove_unused_frame_from_dpb(void);
00032 static int is_short_term_reference(FrameStore* fs);
00033 static int is_long_term_reference(FrameStore* fs);
00034 void gen_field_ref_ids(StorablePicture *p);
00035
00036 DecodedPictureBuffer dpb;
00037
00038 StorablePicture **listX[6];
00039
00040 ColocatedParams *Co_located = NULL;
00041
00042 ColocatedParams *Co_located_JV[MAX_PLANE] = { NULL, NULL, NULL };
00043
00044 int listXsize[6];
00045
00046 #define MAX_LIST_SIZE 33
00047
00048
00049
00050
00051
00052
00053
00054 void dump_dpb(void)
00055 {
00056 #if DUMP_DPB
00057 unsigned i;
00058
00059 for (i=0; i<dpb.used_size;i++)
00060 {
00061 printf("(");
00062 printf("fn=%d ", dpb.fs[i]->frame_num);
00063 if (dpb.fs[i]->is_used & 1)
00064 {
00065 if (dpb.fs[i]->top_field)
00066 printf("T: poc=%d ", dpb.fs[i]->top_field->poc);
00067 else
00068 printf("T: poc=%d ", dpb.fs[i]->frame->top_poc);
00069 }
00070 if (dpb.fs[i]->is_used & 2)
00071 {
00072 if (dpb.fs[i]->bottom_field)
00073 printf("B: poc=%d ", dpb.fs[i]->bottom_field->poc);
00074 else
00075 printf("B: poc=%d ", dpb.fs[i]->frame->bottom_poc);
00076 }
00077 if (dpb.fs[i]->is_used == 3)
00078 printf("F: poc=%d ", dpb.fs[i]->frame->poc);
00079 printf("G: poc=%d) ", dpb.fs[i]->poc);
00080 if (dpb.fs[i]->is_reference) printf ("ref (%d) ", dpb.fs[i]->is_reference);
00081 if (dpb.fs[i]->is_long_term) printf ("lt_ref (%d) ", dpb.fs[i]->is_reference);
00082 if (dpb.fs[i]->is_output) printf ("out ");
00083 if (dpb.fs[i]->is_used == 3)
00084 {
00085 if (dpb.fs[i]->frame->non_existing) printf ("ne ");
00086 }
00087 printf ("\n");
00088 }
00089 #endif
00090 }
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 int getDpbSize(void)
00101 {
00102 int pic_size = (active_sps->pic_width_in_mbs_minus1 + 1) * (active_sps->pic_height_in_map_units_minus1 + 1) * (active_sps->frame_mbs_only_flag?1:2) * 384;
00103
00104 int size = 0;
00105
00106 switch (active_sps->level_idc)
00107 {
00108 case 9:
00109 size = 152064;
00110 break;
00111 case 10:
00112 size = 152064;
00113 break;
00114 case 11:
00115 if (!IS_FREXT_PROFILE(active_sps->profile_idc)&&(active_sps->constrained_set3_flag == 1))
00116 size = 152064;
00117 else
00118 size = 345600;
00119 break;
00120 case 12:
00121 size = 912384;
00122 break;
00123 case 13:
00124 size = 912384;
00125 break;
00126 case 20:
00127 size = 912384;
00128 break;
00129 case 21:
00130 size = 1824768;
00131 break;
00132 case 22:
00133 size = 3110400;
00134 break;
00135 case 30:
00136 size = 3110400;
00137 break;
00138 case 31:
00139 size = 6912000;
00140 break;
00141 case 32:
00142 size = 7864320;
00143 break;
00144 case 40:
00145 size = 12582912;
00146 break;
00147 case 41:
00148 size = 12582912;
00149 break;
00150 case 42:
00151 size = 13369344;
00152 break;
00153 case 50:
00154 size = 42393600;
00155 break;
00156 case 51:
00157 size = 70778880;
00158 break;
00159 default:
00160 error ("undefined level", 500);
00161 break;
00162 }
00163
00164 size /= pic_size;
00165 return imin( size, 16);
00166 }
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 void check_num_ref(void)
00177 {
00178 if ((int)(dpb.ltref_frames_in_buffer + dpb.ref_frames_in_buffer ) > (imax(1,img->num_ref_frames)))
00179 {
00180 error ("Max. number of reference frames exceeded. Invalid stream.", 500);
00181 }
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 void init_dpb(void)
00193 {
00194 unsigned i,j;
00195
00196 if (dpb.init_done)
00197 {
00198 free_dpb();
00199 }
00200
00201 dpb.size = getDpbSize();
00202
00203 if (dpb.size < (unsigned int)params->num_ref_frames)
00204 {
00205 error ("DPB size at specified level is smaller than the specified number of reference frames. This is not allowed.\n", 1000);
00206 }
00207
00208 dpb.used_size = 0;
00209 dpb.last_picture = NULL;
00210
00211 dpb.ref_frames_in_buffer = 0;
00212 dpb.ltref_frames_in_buffer = 0;
00213
00214 dpb.fs = calloc(dpb.size, sizeof (FrameStore*));
00215 if (NULL==dpb.fs)
00216 no_mem_exit("init_dpb: dpb->fs");
00217
00218 dpb.fs_ref = calloc(dpb.size, sizeof (FrameStore*));
00219 if (NULL==dpb.fs_ref)
00220 no_mem_exit("init_dpb: dpb->fs_ref");
00221
00222 dpb.fs_ltref = calloc(dpb.size, sizeof (FrameStore*));
00223 if (NULL==dpb.fs_ltref)
00224 no_mem_exit("init_dpb: dpb->fs_ltref");
00225
00226 for (i = 0; i < dpb.size; i++)
00227 {
00228 dpb.fs[i] = alloc_frame_store();
00229 dpb.fs_ref[i] = NULL;
00230 dpb.fs_ltref[i] = NULL;
00231 }
00232
00233 for (i = 0; i < 6; i++)
00234 {
00235 listX[i] = calloc(MAX_LIST_SIZE, sizeof (StorablePicture*));
00236 if (NULL==listX[i])
00237 no_mem_exit("init_dpb: listX[i]");
00238 }
00239
00240 for (j = 0; j < 6; j++)
00241 {
00242 for (i = 0; i < MAX_LIST_SIZE; i++)
00243 {
00244 listX[j][i] = NULL;
00245 }
00246 listXsize[j]=0;
00247 }
00248
00249 dpb.last_output_poc = INT_MIN;
00250
00251 img->last_has_mmco_5 = 0;
00252
00253 dpb.init_done = 1;
00254 }
00255
00256
00257
00258
00259
00260
00261
00262
00263 void free_dpb(void)
00264 {
00265 unsigned i;
00266 if (dpb.fs)
00267 {
00268 for (i=0; i<dpb.size; i++)
00269 {
00270 free_frame_store(dpb.fs[i]);
00271 }
00272 free (dpb.fs);
00273 dpb.fs=NULL;
00274 }
00275 if (dpb.fs_ref)
00276 {
00277 free (dpb.fs_ref);
00278 }
00279 if (dpb.fs_ltref)
00280 {
00281 free (dpb.fs_ltref);
00282 }
00283 dpb.last_output_poc = INT_MIN;
00284
00285 for (i=0; i<6; i++)
00286 if (listX[i])
00287 {
00288 free (listX[i]);
00289 listX[i] = NULL;
00290 }
00291
00292 dpb.init_done = 0;
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 FrameStore* alloc_frame_store(void)
00306 {
00307 FrameStore *f;
00308
00309 f = calloc (1, sizeof(FrameStore));
00310 if (NULL==f)
00311 no_mem_exit("alloc_frame_store: f");
00312
00313 f->is_used = 0;
00314 f->is_reference = 0;
00315 f->is_long_term = 0;
00316 f->is_orig_reference = 0;
00317
00318 f->is_output = 0;
00319
00320 f->frame = NULL;;
00321 f->top_field = NULL;
00322 f->bottom_field = NULL;
00323
00324 return f;
00325 }
00326
00327 void alloc_pic_motion(PicMotionParams *motion, int size_y, int size_x)
00328 {
00329 if (active_sps->frame_mbs_only_flag)
00330 {
00331 get_mem3Dint64 (&(motion->ref_pic_id), 2, size_y, size_x);
00332 get_mem3Dint64 (&(motion->ref_id), 2, size_y, size_x);
00333 }
00334 else
00335 {
00336 get_mem3Dint64 (&(motion->ref_pic_id), 6, size_y, size_x);
00337 get_mem3Dint64 (&(motion->ref_id), 6, size_y, size_x);
00338 }
00339
00340 get_mem4Dshort (&(motion->mv), 2, size_y, size_x, 2);
00341 get_mem3D((byte****)(&(motion->ref_idx)), 2, size_y, size_x);
00342
00343 motion->mb_field = calloc (size_y * size_x, sizeof(byte));
00344 if (motion->mb_field == NULL)
00345 no_mem_exit("alloc_storable_picture: motion->mb_field");
00346
00347 get_mem2D (&(motion->field_frame), size_y, size_x);
00348 }
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 StorablePicture* alloc_storable_picture(PictureStructure structure, int size_x, int size_y, int size_x_cr, int size_y_cr)
00371 {
00372 StorablePicture *s;
00373 int nplane;
00374 int dec;
00375 int ndec = params->NoOfDecoders;
00376
00377
00378
00379 s = calloc (1, sizeof(StorablePicture));
00380 if (NULL==s)
00381 no_mem_exit("alloc_storable_picture: s");
00382
00383 s->imgUV = NULL;
00384 s->imgY_sub = NULL;
00385 s->imgUV_sub = NULL;
00386
00387 s->p_img_sub[0] = NULL;
00388 s->p_img_sub[1] = NULL;
00389 s->p_img_sub[2] = NULL;
00390
00391 s->dec_imgY = NULL;
00392 s->dec_imgUV = NULL;
00393 s->mb_error_map = NULL;
00394 s->p_dec_img[0] = NULL;
00395 s->p_dec_img[1] = NULL;
00396 s->p_dec_img[2] = NULL;
00397
00398 if ((params->rdopt == 3) && (ndec > 0))
00399 {
00400 get_mem3D(&(s->mb_error_map), ndec, size_y/MB_BLOCK_SIZE, size_x/MB_BLOCK_SIZE);
00401 get_mem3Dpel(&(s->dec_imgY), ndec, size_y, size_x);
00402
00403
00404 if ((s->p_dec_img[0] = (imgpel***)calloc(ndec,sizeof(imgpel**))) == NULL)
00405 {
00406 no_mem_exit("mbuffer.c: p_dec_img[0]");
00407 }
00408
00409 if (img->yuv_format != YUV400)
00410 {
00411 get_mem4Dpel(&(s->dec_imgUV), ndec, 2, size_y_cr, size_x_cr);
00412 if ((s->p_dec_img[1] = (imgpel***)calloc(ndec,sizeof(imgpel**))) == NULL)
00413 {
00414 no_mem_exit("mbuffer.c: p_dec_img[1]");
00415 }
00416 if ((s->p_dec_img[2] = (imgpel***)calloc(ndec,sizeof(imgpel**))) == NULL)
00417 {
00418 no_mem_exit("mbuffer.c: p_dec_img[2]");
00419 }
00420 }
00421
00422 for (dec = 0; dec < ndec; dec++)
00423 {
00424 s->p_dec_img[0][dec] = s->dec_imgY[dec];
00425 }
00426
00427 if (img->yuv_format != YUV400)
00428 {
00429 for (dec = 0; dec < ndec; dec++)
00430 {
00431 s->p_dec_img[1][dec] = s->dec_imgUV[dec][0];
00432 s->p_dec_img[2][dec] = s->dec_imgUV[dec][1];
00433 }
00434 }
00435 }
00436
00437 get_mem2Dpel (&(s->imgY), size_y, size_x);
00438 s->p_img[0] = s->imgY;
00439 s->p_curr_img = s->p_img[0];
00440
00441 if (img->yuv_format != YUV400)
00442 {
00443 get_mem3Dpel (&(s->imgUV), 2, size_y_cr, size_x_cr);
00444 s->p_img[1] = s->imgUV[0];
00445 s->p_img[2] = s->imgUV[1];
00446 }
00447
00448 s->p_curr_img_sub = s->p_img_sub[0];
00449
00450
00451
00452
00453
00454
00455
00456
00457 alloc_pic_motion(&s->motion, size_y / BLOCK_SIZE, size_x / BLOCK_SIZE);
00458
00459 if( IS_INDEPENDENT(params) )
00460 {
00461 for( nplane=0; nplane<MAX_PLANE; nplane++ )
00462 {
00463 alloc_pic_motion(&s->JVmotion[nplane], size_y / BLOCK_SIZE, size_x / BLOCK_SIZE);
00464 }
00465 }
00466
00467 s->pic_num=0;
00468 s->frame_num=0;
00469 s->long_term_frame_idx=0;
00470 s->long_term_pic_num=0;
00471 s->used_for_reference=0;
00472 s->is_long_term=0;
00473 s->non_existing=0;
00474 s->is_output = 0;
00475
00476 s->structure=structure;
00477
00478 s->size_x = size_x;
00479 s->size_y = size_y;
00480 s->size_x_padded = size_x + 2 * IMG_PAD_SIZE;
00481 s->size_y_padded = size_y + 2 * IMG_PAD_SIZE;
00482 s->size_x_pad = size_x + 2 * IMG_PAD_SIZE - 1 - MB_BLOCK_SIZE;
00483 s->size_y_pad = size_y + 2 * IMG_PAD_SIZE - 1 - MB_BLOCK_SIZE;
00484 s->size_x_cr = size_x_cr;
00485 s->size_y_cr = size_y_cr;
00486 s->size_x_cr_pad = (int) (size_x_cr - 1) + (img_pad_size_uv_x << 1) - (img->mb_cr_size_x);
00487 s->size_y_cr_pad = (int) (size_y_cr - 1) + (img_pad_size_uv_y << 1) - (img->mb_cr_size_y);
00488
00489 s->top_field = NULL;
00490 s->bottom_field = NULL;
00491 s->frame = NULL;
00492
00493 s->coded_frame = 0;
00494 s->MbaffFrameFlag = 0;
00495
00496 init_stats(&s->stats);
00497 return s;
00498 }
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510 void free_frame_store(FrameStore* f)
00511 {
00512 if (f)
00513 {
00514 if (f->frame)
00515 {
00516 free_storable_picture(f->frame);
00517 f->frame=NULL;
00518 }
00519 if (f->top_field)
00520 {
00521 free_storable_picture(f->top_field);
00522 f->top_field=NULL;
00523 }
00524 if (f->bottom_field)
00525 {
00526 free_storable_picture(f->bottom_field);
00527 f->bottom_field=NULL;
00528 }
00529 free(f);
00530 }
00531 }
00532
00533 void free_pic_motion(PicMotionParams *motion)
00534 {
00535 if (motion->ref_pic_id)
00536 {
00537 free_mem3Dint64 (motion->ref_pic_id);
00538 motion->ref_pic_id = NULL;
00539 }
00540 if (motion->ref_id)
00541 {
00542 free_mem3Dint64 (motion->ref_id);
00543 motion->ref_id = NULL;
00544 }
00545
00546 if (motion->mv)
00547 {
00548 free_mem4Dshort (motion->mv);
00549 motion->mv = NULL;
00550 }
00551
00552 if (motion->ref_idx)
00553 {
00554 free_mem3D ((byte***)motion->ref_idx);
00555 motion->ref_idx = NULL;
00556 }
00557
00558 if (motion->mb_field)
00559 {
00560 free(motion->mb_field);
00561 motion->mb_field=NULL;
00562 }
00563
00564 if (motion->field_frame)
00565 {
00566 free_mem2D (motion->field_frame);
00567 motion->field_frame=NULL;
00568 }
00569 }
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582 void free_storable_picture(StorablePicture* p)
00583 {
00584 int nplane;
00585 if (p)
00586 {
00587
00588 free_pic_motion(&p->motion);
00589
00590 if( IS_INDEPENDENT(params) )
00591 {
00592 for( nplane=0; nplane<MAX_PLANE; nplane++ )
00593 {
00594 free_pic_motion(&p->JVmotion[nplane]);
00595 }
00596 }
00597
00598 if (p->imgY)
00599 {
00600 free_mem2Dpel (p->imgY);
00601 p->imgY=NULL;
00602 }
00603
00604 if( IS_INDEPENDENT(params) )
00605 {
00606 if (p->imgY_sub)
00607 {
00608 free_mem4Dpel (p->imgY_sub);
00609 p->imgY_sub=NULL;
00610 }
00611 if (p->imgUV_sub)
00612 {
00613 free_mem5Dpel (p->imgUV_sub);
00614 p->imgUV_sub = NULL;
00615 }
00616
00617 p->p_curr_img = NULL;
00618 p->p_curr_img_sub = NULL;
00619 p->p_img[0] = NULL;
00620 p->p_img[1] = NULL;
00621 p->p_img[2] = NULL;
00622 p->p_img_sub[0] = NULL;
00623 p->p_img_sub[1] = NULL;
00624 p->p_img_sub[2] = NULL;
00625 }
00626 else
00627 {
00628 if (p->imgY_sub)
00629 {
00630 free_mem4Dpel (p->imgY_sub);
00631 p->imgY_sub=NULL;
00632 }
00633
00634 if ( p->imgUV_sub && img->yuv_format != YUV400 && params->ChromaMCBuffer )
00635 {
00636 free_mem5Dpel (p->imgUV_sub);
00637 p->imgUV_sub = NULL;
00638 }
00639 }
00640
00641 if (p->imgUV)
00642 {
00643 free_mem3Dpel (p->imgUV);
00644 p->imgUV=NULL;
00645 }
00646
00647 if (p->dec_imgY)
00648 {
00649 free_mem3Dpel(p->dec_imgY);
00650 }
00651 if (p->dec_imgUV)
00652 {
00653 free_mem4Dpel(p->dec_imgUV);
00654 }
00655 for (nplane = 0; nplane < 3; nplane++)
00656 {
00657 if (p->p_dec_img[nplane])
00658 {
00659 free(p->p_dec_img[nplane]);
00660 p->p_dec_img[nplane] = NULL;
00661 }
00662 }
00663 if (p->mb_error_map)
00664 {
00665 free_mem3D(p->mb_error_map);
00666 }
00667
00668 p->mb_error_map = NULL;
00669 p->dec_imgY = NULL;
00670 p->dec_imgUV = NULL;
00671
00672 free(p);
00673 p = NULL;
00674 }
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684 static void unmark_for_reference(FrameStore* fs)
00685 {
00686
00687 if (fs->is_used & 1)
00688 {
00689 if (fs->top_field)
00690 {
00691 fs->top_field->used_for_reference = 0;
00692 }
00693 }
00694 if (fs->is_used & 2)
00695 {
00696 if (fs->bottom_field)
00697 {
00698 fs->bottom_field->used_for_reference = 0;
00699 }
00700 }
00701 if (fs->is_used == 3)
00702 {
00703 if (fs->top_field && fs->bottom_field)
00704 {
00705 fs->top_field->used_for_reference = 0;
00706 fs->bottom_field->used_for_reference = 0;
00707 }
00708 fs->frame->used_for_reference = 0;
00709 }
00710
00711 fs->is_reference = 0;
00712
00713 if(fs->frame)
00714 {
00715 if (fs->frame->imgY_sub)
00716 {
00717 free_mem4Dpel (fs->frame->imgY_sub);
00718 fs->frame->imgY_sub=NULL;
00719 }
00720
00721 if (fs->frame->imgUV_sub)
00722 {
00723 free_mem5Dpel (fs->frame->imgUV_sub);
00724 fs->frame->imgUV_sub = NULL;
00725 }
00726
00727 free_pic_motion(&fs->frame->motion);
00728 }
00729
00730 if (fs->top_field)
00731 {
00732 if (fs->top_field->imgY_sub)
00733 {
00734 free_mem4Dpel (fs->top_field->imgY_sub);
00735 fs->top_field->imgY_sub=NULL;
00736 }
00737
00738 if (fs->top_field->imgUV_sub)
00739 {
00740 free_mem5Dpel (fs->top_field->imgUV_sub);
00741 fs->top_field->imgUV_sub = NULL;
00742 }
00743
00744 free_pic_motion(&fs->top_field->motion);
00745 }
00746 if (fs->bottom_field)
00747 {
00748 if (fs->bottom_field->imgY_sub)
00749 {
00750 free_mem4Dpel (fs->bottom_field->imgY_sub);
00751 fs->bottom_field->imgY_sub=NULL;
00752 }
00753 if (fs->bottom_field->imgUV_sub)
00754 {
00755 free_mem5Dpel (fs->bottom_field->imgUV_sub);
00756 fs->bottom_field->imgUV_sub = NULL;
00757 }
00758
00759 free_pic_motion(&fs->bottom_field->motion);
00760 }
00761 }
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771 static void unmark_for_long_term_reference(FrameStore* fs)
00772 {
00773
00774 if (fs->is_used & 1)
00775 {
00776 if (fs->top_field)
00777 {
00778 fs->top_field->used_for_reference = 0;
00779 fs->top_field->is_long_term = 0;
00780 }
00781 }
00782 if (fs->is_used & 2)
00783 {
00784 if (fs->bottom_field)
00785 {
00786 fs->bottom_field->used_for_reference = 0;
00787 fs->bottom_field->is_long_term = 0;
00788 }
00789 }
00790 if (fs->is_used == 3)
00791 {
00792 if (fs->top_field && fs->bottom_field)
00793 {
00794 fs->top_field->used_for_reference = 0;
00795 fs->top_field->is_long_term = 0;
00796 fs->bottom_field->used_for_reference = 0;
00797 fs->bottom_field->is_long_term = 0;
00798 }
00799 fs->frame->used_for_reference = 0;
00800 fs->frame->is_long_term = 0;
00801 }
00802
00803 fs->is_reference = 0;
00804 fs->is_long_term = 0;
00805 }
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815 static int compare_pic_by_pic_num_desc( const void *arg1, const void *arg2 )
00816 {
00817 if ( (*(StorablePicture**)arg1)->pic_num < (*(StorablePicture**)arg2)->pic_num)
00818 return 1;
00819 if ( (*(StorablePicture**)arg1)->pic_num > (*(StorablePicture**)arg2)->pic_num)
00820 return -1;
00821 else
00822 return 0;
00823 }
00824
00825
00826
00827
00828
00829
00830
00831
00832 static int compare_pic_by_lt_pic_num_asc( const void *arg1, const void *arg2 )
00833 {
00834 if ( (*(StorablePicture**)arg1)->long_term_pic_num < (*(StorablePicture**)arg2)->long_term_pic_num)
00835 return -1;
00836 if ( (*(StorablePicture**)arg1)->long_term_pic_num > (*(StorablePicture**)arg2)->long_term_pic_num)
00837 return 1;
00838 else
00839 return 0;
00840 }
00841
00842
00843
00844
00845
00846
00847
00848
00849 static int compare_fs_by_frame_num_desc( const void *arg1, const void *arg2 )
00850 {
00851 if ( (*(FrameStore**)arg1)->frame_num_wrap < (*(FrameStore**)arg2)->frame_num_wrap)
00852 return 1;
00853 if ( (*(FrameStore**)arg1)->frame_num_wrap > (*(FrameStore**)arg2)->frame_num_wrap)
00854 return -1;
00855 else
00856 return 0;
00857 }
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867 static int compare_fs_by_lt_pic_idx_asc( const void *arg1, const void *arg2 )
00868 {
00869 if ( (*(FrameStore**)arg1)->long_term_frame_idx < (*(FrameStore**)arg2)->long_term_frame_idx)
00870 return -1;
00871 if ( (*(FrameStore**)arg1)->long_term_frame_idx > (*(FrameStore**)arg2)->long_term_frame_idx)
00872 return 1;
00873 else
00874 return 0;
00875 }
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885 static int compare_pic_by_poc_asc( const void *arg1, const void *arg2 )
00886 {
00887 if ( (*(StorablePicture**)arg1)->poc < (*(StorablePicture**)arg2)->poc)
00888 return -1;
00889 if ( (*(StorablePicture**)arg1)->poc > (*(StorablePicture**)arg2)->poc)
00890 return 1;
00891 else
00892 return 0;
00893 }
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903 static int compare_pic_by_poc_desc( const void *arg1, const void *arg2 )
00904 {
00905 if ( (*(StorablePicture**)arg1)->poc < (*(StorablePicture**)arg2)->poc)
00906 return 1;
00907 if ( (*(StorablePicture**)arg1)->poc > (*(StorablePicture**)arg2)->poc)
00908 return -1;
00909 else
00910 return 0;
00911 }
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921 static int compare_fs_by_poc_asc( const void *arg1, const void *arg2 )
00922 {
00923 if ( (*(FrameStore**)arg1)->poc < (*(FrameStore**)arg2)->poc)
00924 return -1;
00925 if ( (*(FrameStore**)arg1)->poc > (*(FrameStore**)arg2)->poc)
00926 return 1;
00927 else
00928 return 0;
00929 }
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939 static int compare_fs_by_poc_desc( const void *arg1, const void *arg2 )
00940 {
00941 if ( (*(FrameStore**)arg1)->poc < (*(FrameStore**)arg2)->poc)
00942 return 1;
00943 if ( (*(FrameStore**)arg1)->poc > (*(FrameStore**)arg2)->poc)
00944 return -1;
00945 else
00946 return 0;
00947 }
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957 int is_short_ref(StorablePicture *s)
00958 {
00959 return ((s->used_for_reference) && (!(s->is_long_term)));
00960 }
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970 int is_long_ref(StorablePicture *s)
00971 {
00972 return ((s->used_for_reference) && (s->is_long_term));
00973 }
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983 static void gen_pic_list_from_frame_list(PictureStructure currStrcture, FrameStore **fs_list, int list_idx, StorablePicture **list, int *list_size, int long_term)
00984 {
00985 int top_idx = 0;
00986 int bot_idx = 0;
00987
00988 int (*is_ref)(StorablePicture *s);
00989
00990 if (long_term)
00991 is_ref=is_long_ref;
00992 else
00993 is_ref=is_short_ref;
00994
00995 if (currStrcture == TOP_FIELD)
00996 {
00997 while ((top_idx<list_idx)||(bot_idx<list_idx))
00998 {
00999 for ( ; top_idx<list_idx; top_idx++)
01000 {
01001 if(fs_list[top_idx]->is_used & 1)
01002 {
01003 if(is_ref(fs_list[top_idx]->top_field))
01004 {
01005
01006 list[*list_size] = fs_list[top_idx]->top_field;
01007 (*list_size)++;
01008 top_idx++;
01009 break;
01010 }
01011 }
01012 }
01013 for ( ; bot_idx<list_idx; bot_idx++)
01014 {
01015 if(fs_list[bot_idx]->is_used & 2)
01016 {
01017 if(is_ref(fs_list[bot_idx]->bottom_field))
01018 {
01019
01020 list[*list_size] = fs_list[bot_idx]->bottom_field;
01021 (*list_size)++;
01022 bot_idx++;
01023 break;
01024 }
01025 }
01026 }
01027 }
01028 }
01029 if (currStrcture == BOTTOM_FIELD)
01030 {
01031 while ((top_idx<list_idx)||(bot_idx<list_idx))
01032 {
01033 for ( ; bot_idx<list_idx; bot_idx++)
01034 {
01035 if(fs_list[bot_idx]->is_used & 2)
01036 {
01037 if(is_ref(fs_list[bot_idx]->bottom_field))
01038 {
01039
01040 list[*list_size] = fs_list[bot_idx]->bottom_field;
01041 (*list_size)++;
01042 bot_idx++;
01043 break;
01044 }
01045 }
01046 }
01047 for ( ; top_idx<list_idx; top_idx++)
01048 {
01049 if(fs_list[top_idx]->is_used & 1)
01050 {
01051 if(is_ref(fs_list[top_idx]->top_field))
01052 {
01053
01054 list[*list_size] = fs_list[top_idx]->top_field;
01055 (*list_size)++;
01056 top_idx++;
01057 break;
01058 }
01059 }
01060 }
01061 }
01062 }
01063 }
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073 void init_lists(int currSliceType, PictureStructure currPicStructure)
01074 {
01075 int add_top = 0, add_bottom = 0;
01076 unsigned int i;
01077 int j, diff;
01078
01079 int list0idx = 0;
01080 int list0idx_1 = 0;
01081 int listltidx = 0;
01082
01083 FrameStore **fs_list0;
01084 FrameStore **fs_list1;
01085 FrameStore **fs_listlt;
01086
01087 StorablePicture *tmp_s;
01088
01089 if (currPicStructure == FRAME)
01090 {
01091 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01092 {
01093 if (dpb.fs_ref[i]->is_used==3)
01094 {
01095 if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
01096 {
01097 if( dpb.fs_ref[i]->frame_num > img->frame_num )
01098 {
01099 dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num - max_frame_num;
01100 }
01101 else
01102 {
01103 dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num;
01104 }
01105 dpb.fs_ref[i]->frame->pic_num = dpb.fs_ref[i]->frame_num_wrap;
01106 }
01107 }
01108 }
01109
01110 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01111 {
01112 if (dpb.fs_ltref[i]->is_used==3)
01113 {
01114 if (dpb.fs_ltref[i]->frame->is_long_term)
01115 {
01116 dpb.fs_ltref[i]->frame->long_term_pic_num = dpb.fs_ltref[i]->frame->long_term_frame_idx;
01117 }
01118 }
01119 }
01120 }
01121 else
01122 {
01123 if (currPicStructure == TOP_FIELD)
01124 {
01125 add_top = 1;
01126 add_bottom = 0;
01127 }
01128 else
01129 {
01130 add_top = 0;
01131 add_bottom = 1;
01132 }
01133
01134 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01135 {
01136 if (dpb.fs_ref[i]->is_reference)
01137 {
01138 if( dpb.fs_ref[i]->frame_num > img->frame_num )
01139 {
01140 dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num - max_frame_num;
01141 }
01142 else
01143 {
01144 dpb.fs_ref[i]->frame_num_wrap = dpb.fs_ref[i]->frame_num;
01145 }
01146 if (dpb.fs_ref[i]->is_reference & 1)
01147 {
01148 dpb.fs_ref[i]->top_field->pic_num = (2 * dpb.fs_ref[i]->frame_num_wrap) + add_top;
01149 }
01150 if (dpb.fs_ref[i]->is_reference & 2)
01151 {
01152 dpb.fs_ref[i]->bottom_field->pic_num = (2 * dpb.fs_ref[i]->frame_num_wrap) + add_bottom;
01153 }
01154 }
01155 }
01156
01157 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01158 {
01159 if (dpb.fs_ltref[i]->is_long_term & 1)
01160 {
01161 dpb.fs_ltref[i]->top_field->long_term_pic_num = 2 * dpb.fs_ltref[i]->top_field->long_term_frame_idx + add_top;
01162 }
01163 if (dpb.fs_ltref[i]->is_long_term & 2)
01164 {
01165 dpb.fs_ltref[i]->bottom_field->long_term_pic_num = 2 * dpb.fs_ltref[i]->bottom_field->long_term_frame_idx + add_bottom;
01166 }
01167 }
01168 }
01169
01170
01171
01172 if ((currSliceType == I_SLICE)||(currSliceType == SI_SLICE))
01173 {
01174 listXsize[0] = 0;
01175 listXsize[1] = 0;
01176 return;
01177 }
01178
01179 if ((currSliceType == P_SLICE)||(currSliceType == SP_SLICE))
01180 {
01181
01182 if (currPicStructure == FRAME)
01183 {
01184 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01185 {
01186 if (dpb.fs_ref[i]->is_used==3)
01187 {
01188 if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
01189 {
01190 listX[0][list0idx++] = dpb.fs_ref[i]->frame;
01191 }
01192 }
01193 }
01194
01195 qsort((void *)listX[0], list0idx, sizeof(StorablePicture*), compare_pic_by_pic_num_desc);
01196 listXsize[0] = list0idx;
01197
01198
01199
01200 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01201 {
01202 if (dpb.fs_ltref[i]->is_used==3)
01203 {
01204 if (dpb.fs_ltref[i]->frame->is_long_term)
01205 {
01206 listX[0][list0idx++]=dpb.fs_ltref[i]->frame;
01207 }
01208 }
01209 }
01210 qsort((void *)&listX[0][listXsize[0]], list0idx-listXsize[0], sizeof(StorablePicture*), compare_pic_by_lt_pic_num_asc);
01211 listXsize[0] = list0idx;
01212
01213
01214 }
01215 else
01216 {
01217 fs_list0 = calloc(dpb.size, sizeof (FrameStore*));
01218 if (NULL==fs_list0)
01219 no_mem_exit("init_lists: fs_list0");
01220 fs_listlt = calloc(dpb.size, sizeof (FrameStore*));
01221 if (NULL==fs_listlt)
01222 no_mem_exit("init_lists: fs_listlt");
01223
01224 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01225 {
01226 if (dpb.fs_ref[i]->is_reference)
01227 {
01228 fs_list0[list0idx++] = dpb.fs_ref[i];
01229 }
01230 }
01231
01232 qsort((void *)fs_list0, list0idx, sizeof(FrameStore*), compare_fs_by_frame_num_desc);
01233
01234
01235
01236 listXsize[0] = 0;
01237 gen_pic_list_from_frame_list(currPicStructure, fs_list0, list0idx, listX[0], &listXsize[0], 0);
01238
01239
01240
01241
01242 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01243 {
01244 fs_listlt[listltidx++]=dpb.fs_ltref[i];
01245 }
01246
01247 qsort((void *)fs_listlt, listltidx, sizeof(FrameStore*), compare_fs_by_lt_pic_idx_asc);
01248
01249 gen_pic_list_from_frame_list(currPicStructure, fs_listlt, listltidx, listX[0], &listXsize[0], 1);
01250
01251 free(fs_list0);
01252 free(fs_listlt);
01253 }
01254 listXsize[1] = 0;
01255 }
01256 else
01257 {
01258
01259 if (currPicStructure == FRAME)
01260 {
01261 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01262 {
01263 if (dpb.fs_ref[i]->is_used==3)
01264 {
01265 if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
01266 {
01267 if (img->framepoc > dpb.fs_ref[i]->frame->poc)
01268 {
01269 listX[0][list0idx++] = dpb.fs_ref[i]->frame;
01270 }
01271 }
01272 }
01273 }
01274 qsort((void *)listX[0], list0idx, sizeof(StorablePicture*), compare_pic_by_poc_desc);
01275 list0idx_1 = list0idx;
01276 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01277 {
01278 if (dpb.fs_ref[i]->is_used==3)
01279 {
01280 if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
01281 {
01282 if (img->framepoc < dpb.fs_ref[i]->frame->poc)
01283 {
01284 listX[0][list0idx++] = dpb.fs_ref[i]->frame;
01285 }
01286 }
01287 }
01288 }
01289 qsort((void *)&listX[0][list0idx_1], list0idx-list0idx_1, sizeof(StorablePicture*), compare_pic_by_poc_asc);
01290
01291 for (j=0; j<list0idx_1; j++)
01292 {
01293 listX[1][list0idx-list0idx_1+j]=listX[0][j];
01294 }
01295 for (j=list0idx_1; j<list0idx; j++)
01296 {
01297 listX[1][j-list0idx_1]=listX[0][j];
01298 }
01299
01300 listXsize[0] = listXsize[1] = list0idx;
01301
01302
01303
01304
01305
01306 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01307 {
01308 if (dpb.fs_ltref[i]->is_used==3)
01309 {
01310 if (dpb.fs_ltref[i]->frame->is_long_term)
01311 {
01312 listX[0][list0idx] =dpb.fs_ltref[i]->frame;
01313 listX[1][list0idx++]=dpb.fs_ltref[i]->frame;
01314 }
01315 }
01316 }
01317 qsort((void *)&listX[0][listXsize[0]], list0idx-listXsize[0], sizeof(StorablePicture*), compare_pic_by_lt_pic_num_asc);
01318 qsort((void *)&listX[1][listXsize[0]], list0idx-listXsize[0], sizeof(StorablePicture*), compare_pic_by_lt_pic_num_asc);
01319 listXsize[0] = listXsize[1] = list0idx;
01320 }
01321 else
01322 {
01323 fs_list0 = calloc(dpb.size, sizeof (FrameStore*));
01324 if (NULL==fs_list0)
01325 no_mem_exit("init_lists: fs_list0");
01326 fs_list1 = calloc(dpb.size, sizeof (FrameStore*));
01327 if (NULL==fs_list1)
01328 no_mem_exit("init_lists: fs_list1");
01329 fs_listlt = calloc(dpb.size, sizeof (FrameStore*));
01330 if (NULL==fs_listlt)
01331 no_mem_exit("init_lists: fs_listlt");
01332
01333 listXsize[0] = 0;
01334 listXsize[1] = 1;
01335
01336 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01337 {
01338 if (dpb.fs_ref[i]->is_used)
01339 {
01340 if (img->ThisPOC >= dpb.fs_ref[i]->poc)
01341 {
01342 fs_list0[list0idx++] = dpb.fs_ref[i];
01343 }
01344 }
01345 }
01346 qsort((void *)fs_list0, list0idx, sizeof(FrameStore*), compare_fs_by_poc_desc);
01347 list0idx_1 = list0idx;
01348 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01349 {
01350 if (dpb.fs_ref[i]->is_used)
01351 {
01352 if (img->ThisPOC < dpb.fs_ref[i]->poc)
01353 {
01354 fs_list0[list0idx++] = dpb.fs_ref[i];
01355 }
01356 }
01357 }
01358 qsort((void *)&fs_list0[list0idx_1], list0idx-list0idx_1, sizeof(FrameStore*), compare_fs_by_poc_asc);
01359
01360 for (j=0; j<list0idx_1; j++)
01361 {
01362 fs_list1[list0idx-list0idx_1+j]=fs_list0[j];
01363 }
01364 for (j=list0idx_1; j<list0idx; j++)
01365 {
01366 fs_list1[j-list0idx_1]=fs_list0[j];
01367 }
01368
01369
01370
01371
01372 listXsize[0] = 0;
01373 listXsize[1] = 0;
01374 gen_pic_list_from_frame_list(currPicStructure, fs_list0, list0idx, listX[0], &listXsize[0], 0);
01375 gen_pic_list_from_frame_list(currPicStructure, fs_list1, list0idx, listX[1], &listXsize[1], 0);
01376
01377
01378
01379
01380
01381 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01382 {
01383 fs_listlt[listltidx++]=dpb.fs_ltref[i];
01384 }
01385
01386 qsort((void *)fs_listlt, listltidx, sizeof(FrameStore*), compare_fs_by_lt_pic_idx_asc);
01387
01388 gen_pic_list_from_frame_list(currPicStructure, fs_listlt, listltidx, listX[0], &listXsize[0], 1);
01389 gen_pic_list_from_frame_list(currPicStructure, fs_listlt, listltidx, listX[1], &listXsize[1], 1);
01390
01391 free(fs_list0);
01392 free(fs_list1);
01393 free(fs_listlt);
01394 }
01395 }
01396
01397 if ((listXsize[0] == listXsize[1]) && (listXsize[0] > 1))
01398 {
01399
01400 diff=0;
01401 for (j = 0; j< listXsize[0]; j++)
01402 {
01403 if (listX[0][j]!=listX[1][j])
01404 diff=1;
01405 }
01406 if (!diff)
01407 {
01408 tmp_s = listX[1][0];
01409 listX[1][0]=listX[1][1];
01410 listX[1][1]=tmp_s;
01411 }
01412 }
01413
01414
01415 listXsize[0] = imin (listXsize[0], img->num_ref_idx_l0_active);
01416 listXsize[1] = imin (listXsize[1], img->num_ref_idx_l1_active);
01417
01418
01419 for (i=listXsize[0]; i< (MAX_LIST_SIZE) ; i++)
01420 {
01421 listX[0][i] = NULL;
01422 }
01423 for (i=listXsize[1]; i< (MAX_LIST_SIZE) ; i++)
01424 {
01425 listX[1][i] = NULL;
01426 }
01427 }
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440 void init_mbaff_lists(void)
01441 {
01442 unsigned j;
01443 int i;
01444
01445 for (i=2;i<6;i++)
01446 {
01447 for (j=0; j<MAX_LIST_SIZE; j++)
01448 {
01449 listX[i][j] = NULL;
01450 }
01451 listXsize[i]=0;
01452 }
01453
01454 for (i=0; i<listXsize[0]; i++)
01455 {
01456 listX[2][2*i] =listX[0][i]->top_field;
01457 listX[2][2*i+1]=listX[0][i]->bottom_field;
01458 listX[4][2*i] =listX[0][i]->bottom_field;
01459 listX[4][2*i+1]=listX[0][i]->top_field;
01460 }
01461 listXsize[2]=listXsize[4]=listXsize[0] * 2;
01462
01463 for (i=0; i<listXsize[1]; i++)
01464 {
01465 listX[3][2*i] =listX[1][i]->top_field;
01466 listX[3][2*i+1]=listX[1][i]->bottom_field;
01467 listX[5][2*i] =listX[1][i]->bottom_field;
01468 listX[5][2*i+1]=listX[1][i]->top_field;
01469 }
01470 listXsize[3]=listXsize[5]=listXsize[1] * 2;
01471 }
01472
01473
01474
01475
01476
01477
01478
01479
01480 static StorablePicture* get_short_term_pic(int picNum)
01481 {
01482 unsigned i;
01483
01484 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01485 {
01486 if (img->structure==FRAME)
01487 {
01488 if (dpb.fs_ref[i]->is_reference == 3)
01489 if ((!dpb.fs_ref[i]->frame->is_long_term)&&(dpb.fs_ref[i]->frame->pic_num == picNum))
01490 return dpb.fs_ref[i]->frame;
01491 }
01492 else
01493 {
01494 if (dpb.fs_ref[i]->is_reference & 1)
01495 if ((!dpb.fs_ref[i]->top_field->is_long_term)&&(dpb.fs_ref[i]->top_field->pic_num == picNum))
01496 return dpb.fs_ref[i]->top_field;
01497 if (dpb.fs_ref[i]->is_reference & 2)
01498 if ((!dpb.fs_ref[i]->bottom_field->is_long_term)&&(dpb.fs_ref[i]->bottom_field->pic_num == picNum))
01499 return dpb.fs_ref[i]->bottom_field;
01500 }
01501 }
01502 return NULL;
01503 }
01504
01505
01506
01507
01508
01509
01510
01511
01512 static StorablePicture* get_long_term_pic(int LongtermPicNum)
01513 {
01514 unsigned i;
01515
01516 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01517 {
01518 if (img->structure==FRAME)
01519 {
01520 if (dpb.fs_ltref[i]->is_reference == 3)
01521 if ((dpb.fs_ltref[i]->frame->is_long_term)&&(dpb.fs_ltref[i]->frame->long_term_pic_num == LongtermPicNum))
01522 return dpb.fs_ltref[i]->frame;
01523 }
01524 else
01525 {
01526 if (dpb.fs_ltref[i]->is_reference & 1)
01527 if ((dpb.fs_ltref[i]->top_field->is_long_term)&&(dpb.fs_ltref[i]->top_field->long_term_pic_num == LongtermPicNum))
01528 return dpb.fs_ltref[i]->top_field;
01529 if (dpb.fs_ltref[i]->is_reference & 2)
01530 if ((dpb.fs_ltref[i]->bottom_field->is_long_term)&&(dpb.fs_ltref[i]->bottom_field->long_term_pic_num == LongtermPicNum))
01531 return dpb.fs_ltref[i]->bottom_field;
01532 }
01533 }
01534 return NULL;
01535 }
01536
01537
01538
01539
01540
01541
01542
01543
01544 static void reorder_short_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int picNumLX, int *refIdxLX)
01545 {
01546 int cIdx, nIdx;
01547
01548 StorablePicture *picLX;
01549
01550 picLX = get_short_term_pic(picNumLX);
01551
01552 for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- )
01553 RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1];
01554
01555 RefPicListX[ (*refIdxLX)++ ] = picLX;
01556
01557 nIdx = *refIdxLX;
01558
01559 for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ )
01560 if (RefPicListX[ cIdx ])
01561 if( (RefPicListX[ cIdx ]->is_long_term ) || (RefPicListX[ cIdx ]->pic_num != picNumLX ))
01562 RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ];
01563
01564 }
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574 static void reorder_long_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int LongTermPicNum, int *refIdxLX)
01575 {
01576 int cIdx, nIdx;
01577
01578 StorablePicture *picLX;
01579
01580 picLX = get_long_term_pic(LongTermPicNum);
01581
01582 for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- )
01583 RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1];
01584
01585 RefPicListX[ (*refIdxLX)++ ] = picLX;
01586
01587 nIdx = *refIdxLX;
01588
01589 for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ )
01590 if( (!RefPicListX[ cIdx ]->is_long_term ) || (RefPicListX[ cIdx ]->long_term_pic_num != LongTermPicNum ))
01591 RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ];
01592 }
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602 void reorder_ref_pic_list(StorablePicture **list, int *list_size, int num_ref_idx_lX_active_minus1, int *reordering_of_pic_nums_idc, int *abs_diff_pic_num_minus1, int *long_term_pic_idx)
01603 {
01604 int i;
01605
01606 int maxPicNum, currPicNum, picNumLXNoWrap, picNumLXPred, picNumLX;
01607 int refIdxLX = 0;
01608
01609 if (img->structure==FRAME)
01610 {
01611 maxPicNum = max_frame_num;
01612 currPicNum = img->frame_num;
01613 }
01614 else
01615 {
01616 maxPicNum = 2 * max_frame_num;
01617 currPicNum = 2 * img->frame_num + 1;
01618 }
01619
01620 picNumLXPred = currPicNum;
01621
01622 for (i=0; reordering_of_pic_nums_idc[i]!=3; i++)
01623 {
01624 if (reordering_of_pic_nums_idc[i]>3)
01625 error ("Invalid remapping_of_pic_nums_idc command", 500);
01626
01627 if (reordering_of_pic_nums_idc[i] < 2)
01628 {
01629 if (reordering_of_pic_nums_idc[i] == 0)
01630 {
01631 if( picNumLXPred - ( abs_diff_pic_num_minus1[i] + 1 ) < 0 )
01632 picNumLXNoWrap = picNumLXPred - ( abs_diff_pic_num_minus1[i] + 1 ) + maxPicNum;
01633 else
01634 picNumLXNoWrap = picNumLXPred - ( abs_diff_pic_num_minus1[i] + 1 );
01635 }
01636 else
01637 {
01638 if( picNumLXPred + ( abs_diff_pic_num_minus1[i] + 1 ) >= maxPicNum )
01639 picNumLXNoWrap = picNumLXPred + ( abs_diff_pic_num_minus1[i] + 1 ) - maxPicNum;
01640 else
01641 picNumLXNoWrap = picNumLXPred + ( abs_diff_pic_num_minus1[i] + 1 );
01642 }
01643 picNumLXPred = picNumLXNoWrap;
01644
01645 if( picNumLXNoWrap > currPicNum )
01646 picNumLX = picNumLXNoWrap - maxPicNum;
01647 else
01648 picNumLX = picNumLXNoWrap;
01649
01650 reorder_short_term(list, num_ref_idx_lX_active_minus1, picNumLX, &refIdxLX);
01651 }
01652 else
01653 {
01654 reorder_long_term(list, num_ref_idx_lX_active_minus1, long_term_pic_idx[i], &refIdxLX);
01655 }
01656
01657 }
01658
01659 *list_size = num_ref_idx_lX_active_minus1 + 1;
01660 }
01661
01662
01663
01664
01665
01666
01667
01668
01669
01670
01671 void update_ref_list(void)
01672 {
01673 unsigned i, j;
01674 for (i=0, j=0; i<dpb.used_size; i++)
01675 {
01676 if (is_short_term_reference(dpb.fs[i]))
01677 {
01678 dpb.fs_ref[j++]=dpb.fs[i];
01679 }
01680 }
01681
01682 dpb.ref_frames_in_buffer = j;
01683
01684 while (j<dpb.size)
01685 {
01686 dpb.fs_ref[j++]=NULL;
01687 }
01688 }
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698
01699 void update_ltref_list(void)
01700 {
01701 unsigned i, j;
01702 for (i=0, j=0; i<dpb.used_size; i++)
01703 {
01704 if (is_long_term_reference(dpb.fs[i]))
01705 {
01706 dpb.fs_ltref[j++]=dpb.fs[i];
01707 }
01708 }
01709
01710 dpb.ltref_frames_in_buffer=j;
01711
01712 while (j<dpb.size)
01713 {
01714 dpb.fs_ltref[j++]=NULL;
01715 }
01716 }
01717
01718
01719
01720
01721
01722
01723
01724
01725 static void idr_memory_management(StorablePicture* p)
01726 {
01727 unsigned i;
01728
01729 assert (img->currentPicture->idr_flag);
01730
01731 if (img->no_output_of_prior_pics_flag)
01732 {
01733
01734 for (i=0; i<dpb.used_size; i++)
01735 {
01736
01737 free_frame_store(dpb.fs[i]);
01738 dpb.fs[i] = alloc_frame_store();
01739 }
01740 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01741 {
01742 dpb.fs_ref[i]=NULL;
01743 }
01744 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01745 {
01746 dpb.fs_ltref[i]=NULL;
01747 }
01748 dpb.used_size=0;
01749 }
01750 else
01751 {
01752 flush_dpb();
01753 }
01754 dpb.last_picture = NULL;
01755
01756 update_ref_list();
01757 update_ltref_list();
01758 dpb.last_output_poc = INT_MIN;
01759
01760 if (img->long_term_reference_flag)
01761 {
01762 dpb.max_long_term_pic_idx = 0;
01763 p->is_long_term = 1;
01764 p->long_term_frame_idx = 0;
01765 }
01766 else
01767 {
01768 dpb.max_long_term_pic_idx = -1;
01769 p->is_long_term = 0;
01770 }
01771 }
01772
01773
01774
01775
01776
01777
01778
01779
01780 static void sliding_window_memory_management(StorablePicture* p)
01781 {
01782 unsigned i;
01783
01784 assert (!img->currentPicture->idr_flag);
01785
01786 if (dpb.ref_frames_in_buffer==active_sps->num_ref_frames - dpb.ltref_frames_in_buffer)
01787 {
01788 for (i=0; i<dpb.used_size;i++)
01789 {
01790 if (dpb.fs[i]->is_reference && (!(dpb.fs[i]->is_long_term)))
01791 {
01792 unmark_for_reference(dpb.fs[i]);
01793 update_ref_list();
01794 break;
01795 }
01796 }
01797 }
01798
01799 p->is_long_term = 0;
01800 }
01801
01802
01803
01804
01805
01806
01807
01808 static int get_pic_num_x (StorablePicture *p, int difference_of_pic_nums_minus1)
01809 {
01810 int currPicNum;
01811
01812 if (p->structure == FRAME)
01813 currPicNum = p->frame_num;
01814 else
01815 currPicNum = 2 * p->frame_num + 1;
01816
01817 return currPicNum - (difference_of_pic_nums_minus1 + 1);
01818 }
01819
01820
01821
01822
01823
01824
01825
01826
01827 static void mm_unmark_short_term_for_reference(StorablePicture *p, int difference_of_pic_nums_minus1)
01828 {
01829 int picNumX;
01830
01831 unsigned i;
01832
01833 picNumX = get_pic_num_x(p, difference_of_pic_nums_minus1);
01834
01835 for (i=0; i<dpb.ref_frames_in_buffer; i++)
01836 {
01837 if (p->structure == FRAME)
01838 {
01839 if ((dpb.fs_ref[i]->is_reference==3) && (dpb.fs_ref[i]->is_long_term==0))
01840 {
01841 if (dpb.fs_ref[i]->frame->pic_num == picNumX)
01842 {
01843 unmark_for_reference(dpb.fs_ref[i]);
01844 return;
01845 }
01846 }
01847 }
01848 else
01849 {
01850 if ((dpb.fs_ref[i]->is_reference & 1) && (!(dpb.fs_ref[i]->is_long_term & 1)))
01851 {
01852 if (dpb.fs_ref[i]->top_field->pic_num == picNumX)
01853 {
01854 dpb.fs_ref[i]->top_field->used_for_reference = 0;
01855 dpb.fs_ref[i]->is_reference &= 2;
01856 if (dpb.fs_ref[i]->is_used == 3)
01857 {
01858 dpb.fs_ref[i]->frame->used_for_reference = 0;
01859 }
01860 return;
01861 }
01862 }
01863 if ((dpb.fs_ref[i]->is_reference & 2) && (!(dpb.fs_ref[i]->is_long_term & 2)))
01864 {
01865 if (dpb.fs_ref[i]->bottom_field->pic_num == picNumX)
01866 {
01867 dpb.fs_ref[i]->bottom_field->used_for_reference = 0;
01868 dpb.fs_ref[i]->is_reference &= 1;
01869 if (dpb.fs_ref[i]->is_used == 3)
01870 {
01871 dpb.fs_ref[i]->frame->used_for_reference = 0;
01872 }
01873 return;
01874 }
01875 }
01876 }
01877 }
01878 }
01879
01880
01881
01882
01883
01884
01885
01886
01887 static void mm_unmark_long_term_for_reference(StorablePicture *p, int long_term_pic_num)
01888 {
01889 unsigned i;
01890 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
01891 {
01892 if (p->structure == FRAME)
01893 {
01894 if ((dpb.fs_ltref[i]->is_reference==3) && (dpb.fs_ltref[i]->is_long_term==3))
01895 {
01896 if (dpb.fs_ltref[i]->frame->long_term_pic_num == long_term_pic_num)
01897 {
01898 unmark_for_long_term_reference(dpb.fs_ltref[i]);
01899 }
01900 }
01901 }
01902 else
01903 {
01904 if ((dpb.fs_ltref[i]->is_reference & 1) && ((dpb.fs_ltref[i]->is_long_term & 1)))
01905 {
01906 if (dpb.fs_ltref[i]->top_field->long_term_pic_num == long_term_pic_num)
01907 {
01908 dpb.fs_ltref[i]->top_field->used_for_reference = 0;
01909 dpb.fs_ltref[i]->top_field->is_long_term = 0;
01910 dpb.fs_ltref[i]->is_reference &= 2;
01911 dpb.fs_ltref[i]->is_long_term &= 2;
01912 if (dpb.fs_ltref[i]->is_used == 3)
01913 {
01914 dpb.fs_ltref[i]->frame->used_for_reference = 0;
01915 dpb.fs_ltref[i]->frame->is_long_term = 0;
01916 }
01917 return;
01918 }
01919 }
01920 if ((dpb.fs_ltref[i]->is_reference & 2) && ((dpb.fs_ltref[i]->is_long_term & 2)))
01921 {
01922 if (dpb.fs_ltref[i]->bottom_field->long_term_pic_num == long_term_pic_num)
01923 {
01924 dpb.fs_ltref[i]->bottom_field->used_for_reference = 0;
01925 dpb.fs_ltref[i]->bottom_field->is_long_term = 0;
01926 dpb.fs_ltref[i]->is_reference &= 1;
01927 dpb.fs_ltref[i]->is_long_term &= 1;
01928 if (dpb.fs_ltref[i]->is_used == 3)
01929 {
01930 dpb.fs_ltref[i]->frame->used_for_reference = 0;
01931 dpb.fs_ltref[i]->frame->is_long_term = 0;
01932 }
01933 return;
01934 }
01935 }
01936 }
01937 }
01938 }
01939
01940
01941
01942
01943
01944
01945
01946
01947 static void unmark_long_term_frame_for_reference_by_frame_idx(int long_term_frame_idx)
01948 {
01949 unsigned i;
01950 for(i=0; i<dpb.ltref_frames_in_buffer; i++)
01951 {
01952 if (dpb.fs_ltref[i]->long_term_frame_idx == long_term_frame_idx)
01953 unmark_for_long_term_reference(dpb.fs_ltref[i]);
01954 }
01955 }
01956
01957
01958
01959
01960
01961
01962
01963
01964 static void unmark_long_term_field_for_reference_by_frame_idx(PictureStructure structure, int long_term_frame_idx, int mark_current, unsigned curr_frame_num, int curr_pic_num)
01965 {
01966 unsigned i;
01967
01968 assert(structure!=FRAME);
01969 if (curr_pic_num<0)
01970 curr_pic_num+=(2*max_frame_num);
01971
01972 for(i=0; i<dpb.ltref_frames_in_buffer; i++)
01973 {
01974 if (dpb.fs_ltref[i]->long_term_frame_idx == long_term_frame_idx)
01975 {
01976 if (structure == TOP_FIELD)
01977 {
01978 if ((dpb.fs_ltref[i]->is_long_term == 3))
01979 {
01980 unmark_for_long_term_reference(dpb.fs_ltref[i]);
01981 }
01982 else
01983 {
01984 if ((dpb.fs_ltref[i]->is_long_term == 1))
01985 {
01986 unmark_for_long_term_reference(dpb.fs_ltref[i]);
01987 }
01988 else
01989 {
01990 if (mark_current)
01991 {
01992 if (dpb.last_picture)
01993 {
01994 if ( ( dpb.last_picture != dpb.fs_ltref[i] )|| dpb.last_picture->frame_num != curr_frame_num)
01995 unmark_for_long_term_reference(dpb.fs_ltref[i]);
01996 }
01997 else
01998 {
01999 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02000 }
02001 }
02002 else
02003 {
02004 if ((dpb.fs_ltref[i]->frame_num) != (unsigned)(curr_pic_num/2))
02005 {
02006 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02007 }
02008 }
02009 }
02010 }
02011 }
02012 if (structure == BOTTOM_FIELD)
02013 {
02014 if ((dpb.fs_ltref[i]->is_long_term == 3))
02015 {
02016 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02017 }
02018 else
02019 {
02020 if ((dpb.fs_ltref[i]->is_long_term == 2))
02021 {
02022 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02023 }
02024 else
02025 {
02026 if (mark_current)
02027 {
02028 if (dpb.last_picture)
02029 {
02030 if ( ( dpb.last_picture != dpb.fs_ltref[i] )|| dpb.last_picture->frame_num != curr_frame_num)
02031 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02032 }
02033 else
02034 {
02035 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02036 }
02037 }
02038 else
02039 {
02040 if ((dpb.fs_ltref[i]->frame_num) != (unsigned)(curr_pic_num/2))
02041 {
02042 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02043 }
02044 }
02045 }
02046 }
02047 }
02048 }
02049 }
02050 }
02051
02052
02053
02054
02055
02056
02057
02058
02059 static void mark_pic_long_term(StorablePicture* p, int long_term_frame_idx, int picNumX)
02060 {
02061 unsigned i;
02062 int add_top, add_bottom;
02063
02064 if (p->structure == FRAME)
02065 {
02066 for (i=0; i<dpb.ref_frames_in_buffer; i++)
02067 {
02068 if (dpb.fs_ref[i]->is_reference == 3)
02069 {
02070 if ((!dpb.fs_ref[i]->frame->is_long_term)&&(dpb.fs_ref[i]->frame->pic_num == picNumX))
02071 {
02072 dpb.fs_ref[i]->long_term_frame_idx = dpb.fs_ref[i]->frame->long_term_frame_idx
02073 = long_term_frame_idx;
02074 dpb.fs_ref[i]->frame->long_term_pic_num = long_term_frame_idx;
02075 dpb.fs_ref[i]->frame->is_long_term = 1;
02076
02077 if (dpb.fs_ref[i]->top_field && dpb.fs_ref[i]->bottom_field)
02078 {
02079 dpb.fs_ref[i]->top_field->long_term_frame_idx = dpb.fs_ref[i]->bottom_field->long_term_frame_idx
02080 = long_term_frame_idx;
02081 dpb.fs_ref[i]->top_field->long_term_pic_num = long_term_frame_idx;
02082 dpb.fs_ref[i]->bottom_field->long_term_pic_num = long_term_frame_idx;
02083
02084 dpb.fs_ref[i]->top_field->is_long_term = dpb.fs_ref[i]->bottom_field->is_long_term
02085 = 1;
02086
02087 }
02088 dpb.fs_ref[i]->is_long_term = 3;
02089 return;
02090 }
02091 }
02092 }
02093 printf ("Warning: reference frame for long term marking not found\n");
02094 }
02095 else
02096 {
02097 if (p->structure == TOP_FIELD)
02098 {
02099 add_top = 1;
02100 add_bottom = 0;
02101 }
02102 else
02103 {
02104 add_top = 0;
02105 add_bottom = 1;
02106 }
02107 for (i=0; i<dpb.ref_frames_in_buffer; i++)
02108 {
02109 if (dpb.fs_ref[i]->is_reference & 1)
02110 {
02111 if ((!dpb.fs_ref[i]->top_field->is_long_term)&&(dpb.fs_ref[i]->top_field->pic_num == picNumX))
02112 {
02113 if ((dpb.fs_ref[i]->is_long_term) && (dpb.fs_ref[i]->long_term_frame_idx != long_term_frame_idx))
02114 {
02115 printf ("Warning: assigning long_term_frame_idx different from other field\n");
02116 }
02117
02118 dpb.fs_ref[i]->long_term_frame_idx = dpb.fs_ref[i]->top_field->long_term_frame_idx
02119 = long_term_frame_idx;
02120 dpb.fs_ref[i]->top_field->long_term_pic_num = 2 * long_term_frame_idx + add_top;
02121 dpb.fs_ref[i]->top_field->is_long_term = 1;
02122 dpb.fs_ref[i]->is_long_term |= 1;
02123 if (dpb.fs_ref[i]->is_long_term == 3)
02124 {
02125 dpb.fs_ref[i]->frame->is_long_term = 1;
02126 dpb.fs_ref[i]->frame->long_term_frame_idx = dpb.fs_ref[i]->frame->long_term_pic_num = long_term_frame_idx;
02127 }
02128 return;
02129 }
02130 }
02131 if (dpb.fs_ref[i]->is_reference & 2)
02132 {
02133 if ((!dpb.fs_ref[i]->bottom_field->is_long_term)&&(dpb.fs_ref[i]->bottom_field->pic_num == picNumX))
02134 {
02135 if ((dpb.fs_ref[i]->is_long_term) && (dpb.fs_ref[i]->long_term_frame_idx != long_term_frame_idx))
02136 {
02137 printf ("Warning: assigning long_term_frame_idx different from other field\n");
02138 }
02139
02140 dpb.fs_ref[i]->long_term_frame_idx = dpb.fs_ref[i]->bottom_field->long_term_frame_idx
02141 = long_term_frame_idx;
02142 dpb.fs_ref[i]->bottom_field->long_term_pic_num = 2 * long_term_frame_idx + add_bottom;
02143 dpb.fs_ref[i]->bottom_field->is_long_term = 1;
02144 dpb.fs_ref[i]->is_long_term |= 2;
02145 if (dpb.fs_ref[i]->is_long_term == 3)
02146 {
02147 dpb.fs_ref[i]->frame->is_long_term = 1;
02148 dpb.fs_ref[i]->frame->long_term_frame_idx = dpb.fs_ref[i]->frame->long_term_pic_num = long_term_frame_idx;
02149 }
02150 return;
02151 }
02152 }
02153 }
02154 printf ("Warning: reference field for long term marking not found\n");
02155 }
02156 }
02157
02158
02159
02160
02161
02162
02163
02164
02165 static void mm_assign_long_term_frame_idx(StorablePicture* p, int difference_of_pic_nums_minus1, int long_term_frame_idx)
02166 {
02167 int picNumX;
02168
02169 picNumX = get_pic_num_x(p, difference_of_pic_nums_minus1);
02170
02171
02172 if (p->structure == FRAME)
02173 {
02174 unmark_long_term_frame_for_reference_by_frame_idx(long_term_frame_idx);
02175 }
02176 else
02177 {
02178 unsigned i;
02179 PictureStructure structure = FRAME;
02180
02181 for (i=0; i<dpb.ref_frames_in_buffer; i++)
02182 {
02183 if (dpb.fs_ref[i]->is_reference & 1)
02184 {
02185 if (dpb.fs_ref[i]->top_field->pic_num == picNumX)
02186 {
02187 structure = TOP_FIELD;
02188 break;
02189 }
02190 }
02191 if (dpb.fs_ref[i]->is_reference & 2)
02192 {
02193 if (dpb.fs_ref[i]->bottom_field->pic_num == picNumX)
02194 {
02195 structure = BOTTOM_FIELD;
02196 break;
02197 }
02198 }
02199 }
02200 if (structure==FRAME)
02201 {
02202 error ("field for long term marking not found",200);
02203 }
02204
02205 unmark_long_term_field_for_reference_by_frame_idx(structure, long_term_frame_idx, 0, 0, picNumX);
02206 }
02207
02208 mark_pic_long_term(p, long_term_frame_idx, picNumX);
02209 }
02210
02211
02212
02213
02214
02215
02216
02217 void mm_update_max_long_term_frame_idx(int max_long_term_frame_idx_plus1)
02218 {
02219 unsigned i;
02220
02221 dpb.max_long_term_pic_idx = max_long_term_frame_idx_plus1 - 1;
02222
02223
02224 for (i=0; i<dpb.ltref_frames_in_buffer; i++)
02225 {
02226 if (dpb.fs_ltref[i]->long_term_frame_idx > dpb.max_long_term_pic_idx)
02227 {
02228 unmark_for_long_term_reference(dpb.fs_ltref[i]);
02229 }
02230 }
02231 }
02232
02233
02234
02235
02236
02237
02238
02239
02240 static void mm_unmark_all_long_term_for_reference (void)
02241 {
02242 mm_update_max_long_term_frame_idx(0);
02243 }
02244
02245
02246
02247
02248
02249
02250
02251 static void mm_unmark_all_short_term_for_reference (void)
02252 {
02253 unsigned int i;
02254 for (i=0; i<dpb.ref_frames_in_buffer; i++)
02255 {
02256 unmark_for_reference(dpb.fs_ref[i]);
02257 }
02258 update_ref_list();
02259 }
02260
02261
02262
02263
02264
02265
02266
02267
02268 static void mm_mark_current_picture_long_term(StorablePicture *p, int long_term_frame_idx)
02269 {
02270
02271 if (p->structure == FRAME)
02272 {
02273 unmark_long_term_frame_for_reference_by_frame_idx(long_term_frame_idx);
02274 }
02275 else
02276 {
02277 unmark_long_term_field_for_reference_by_frame_idx(p->structure, long_term_frame_idx, 1, p->pic_num, 0);
02278 }
02279
02280 p->is_long_term = 1;
02281 p->long_term_frame_idx = long_term_frame_idx;
02282 }
02283
02284
02285
02286
02287
02288
02289
02290
02291 static void adaptive_memory_management(StorablePicture* p)
02292 {
02293 DecRefPicMarking_t *tmp_drpm;
02294
02295 img->last_has_mmco_5 = 0;
02296
02297 assert (!img->currentPicture->idr_flag);
02298 assert (img->adaptive_ref_pic_buffering_flag);
02299
02300 while (img->dec_ref_pic_marking_buffer)
02301 {
02302 tmp_drpm = img->dec_ref_pic_marking_buffer;
02303 switch (tmp_drpm->memory_management_control_operation)
02304 {
02305 case 0:
02306 if (tmp_drpm->Next != NULL)
02307 {
02308 error ("memory_management_control_operation = 0 not last operation in buffer", 500);
02309 }
02310 break;
02311 case 1:
02312 mm_unmark_short_term_for_reference(p, tmp_drpm->difference_of_pic_nums_minus1);
02313 update_ref_list();
02314 break;
02315 case 2:
02316 mm_unmark_long_term_for_reference(p, tmp_drpm->long_term_pic_num);
02317 update_ltref_list();
02318 break;
02319 case 3:
02320 mm_assign_long_term_frame_idx(p, tmp_drpm->difference_of_pic_nums_minus1, tmp_drpm->long_term_frame_idx);
02321 update_ref_list();
02322 update_ltref_list();
02323 break;
02324 case 4:
02325 mm_update_max_long_term_frame_idx (tmp_drpm->max_long_term_frame_idx_plus1);
02326 update_ltref_list();
02327 break;
02328 case 5:
02329 mm_unmark_all_short_term_for_reference();
02330 mm_unmark_all_long_term_for_reference();
02331 img->last_has_mmco_5 = 1;
02332 break;
02333 case 6:
02334 mm_mark_current_picture_long_term(p, tmp_drpm->long_term_frame_idx);
02335 check_num_ref();
02336 break;
02337 default:
02338 error ("invalid memory_management_control_operation in buffer", 500);
02339 }
02340 img->dec_ref_pic_marking_buffer = tmp_drpm->Next;
02341 free (tmp_drpm);
02342 }
02343 if ( img->last_has_mmco_5 )
02344 {
02345 p->pic_num = p->frame_num = 0;
02346
02347 switch (p->structure)
02348 {
02349 case TOP_FIELD:
02350 {
02351 p->poc = p->top_poc = img->toppoc =0;
02352 break;
02353 }
02354 case BOTTOM_FIELD:
02355 {
02356 p->poc = p->bottom_poc = img->bottompoc = 0;
02357 break;
02358 }
02359 case FRAME:
02360 {
02361 p->top_poc -= p->poc;
02362 p->bottom_poc -= p->poc;
02363
02364 img->toppoc = p->top_poc;
02365 img->bottompoc = p->bottom_poc;
02366
02367 p->poc = imin (p->top_poc, p->bottom_poc);
02368 img->framepoc = p->poc;
02369 break;
02370 }
02371 }
02372 img->ThisPOC = p->poc;
02373 flush_dpb();
02374 }
02375 }
02376
02377
02378
02379
02380
02381
02382
02383
02384
02385
02386
02387
02388
02389
02390
02391
02392 void store_picture_in_dpb(StorablePicture* p)
02393 {
02394 unsigned i;
02395 int poc, pos;
02396
02397
02398
02399 assert (p!=NULL);
02400
02401 p->used_for_reference = (img->nal_reference_idc != NALU_PRIORITY_DISPOSABLE);
02402 p->type = img->type;
02403
02404 img->last_has_mmco_5=0;
02405 img->last_pic_bottom_field = (img->structure == BOTTOM_FIELD);
02406
02407 if (img->currentPicture->idr_flag)
02408 idr_memory_management(p);
02409 else
02410 {
02411
02412 if (p->used_for_reference && (img->adaptive_ref_pic_buffering_flag))
02413 adaptive_memory_management(p);
02414 }
02415
02416 if ((p->structure==TOP_FIELD)||(p->structure==BOTTOM_FIELD))
02417 {
02418
02419 if (dpb.last_picture)
02420 {
02421 if ((int)dpb.last_picture->frame_num == p->pic_num)
02422 {
02423 if (((p->structure==TOP_FIELD)&&(dpb.last_picture->is_used==2))||((p->structure==BOTTOM_FIELD)&&(dpb.last_picture->is_used==1)))
02424 {
02425 if ((p->used_for_reference && (dpb.last_picture->is_orig_reference!=0))||
02426 (!p->used_for_reference && (dpb.last_picture->is_orig_reference==0)))
02427 {
02428 insert_picture_in_dpb(dpb.last_picture, p);
02429 update_ref_list();
02430 update_ltref_list();
02431 dump_dpb();
02432 dpb.last_picture = NULL;
02433 return;
02434 }
02435 }
02436 }
02437 }
02438 }
02439
02440
02441
02442
02443 if ((!img->currentPicture->idr_flag)&&(p->used_for_reference && (!img->adaptive_ref_pic_buffering_flag)))
02444 {
02445 sliding_window_memory_management(p);
02446 }
02447
02448
02449 if (dpb.used_size==dpb.size)
02450 {
02451 remove_unused_frame_from_dpb();
02452 }
02453
02454
02455 while (dpb.used_size==dpb.size)
02456 {
02457
02458 if (!p->used_for_reference)
02459 {
02460 get_smallest_poc(&poc, &pos);
02461 if ((-1==pos) || (p->poc < poc))
02462 {
02463 direct_output(p, p_dec);
02464 return;
02465 }
02466 }
02467
02468 output_one_frame_from_dpb();
02469 }
02470
02471
02472 if ((p->used_for_reference)&&(!p->is_long_term))
02473 {
02474 for (i=0; i<dpb.ref_frames_in_buffer; i++)
02475 {
02476 if (dpb.fs_ref[i]->frame_num == p->frame_num)
02477 {
02478 error("duplicate frame_num im short-term reference picture buffer", 500);
02479 }
02480 }
02481
02482 }
02483
02484 insert_picture_in_dpb(dpb.fs[dpb.used_size],p);
02485
02486 if (p->structure != FRAME)
02487 {
02488 dpb.last_picture = dpb.fs[dpb.used_size];
02489 }
02490 else
02491 {
02492 dpb.last_picture = NULL;
02493 }
02494
02495 dpb.used_size++;
02496
02497 update_ref_list();
02498 update_ltref_list();
02499
02500 check_num_ref();
02501
02502 dump_dpb();
02503 }
02504
02505
02506
02507
02508
02509
02510
02511
02512
02513
02514
02515
02516
02517 void replace_top_pic_with_frame(StorablePicture* p)
02518 {
02519 FrameStore* fs = NULL;
02520 unsigned i, found;
02521
02522 assert (p!=NULL);
02523 assert (p->structure==FRAME);
02524
02525 p->used_for_reference = (img->nal_reference_idc != NALU_PRIORITY_DISPOSABLE);
02526 p->type = img->type;
02527
02528 if (p->used_for_reference)
02529 {
02530 if( IS_INDEPENDENT(params) )
02531 {
02532 UnifiedOneForthPix_JV(0, p);
02533 UnifiedOneForthPix_JV(1, p);
02534 UnifiedOneForthPix_JV(2, p);
02535 }
02536 else
02537 {
02538 UnifiedOneForthPix(p);
02539 }
02540 }
02541
02542 found=0;
02543
02544 for (i=0;i<dpb.used_size;i++)
02545 {
02546 if((dpb.fs[i]->frame_num == img->frame_num)&&(dpb.fs[i]->is_used==1))
02547 {
02548 found=1;
02549 fs = dpb.fs[i];
02550 break;
02551 }
02552 }
02553
02554 if (!found)
02555 {
02556
02557 direct_output_paff(p, p_dec);
02558 }
02559 else
02560 {
02561 free_storable_picture(fs->top_field);
02562 fs->top_field=NULL;
02563 fs->frame=p;
02564 fs->is_used = 3;
02565 if (p->used_for_reference)
02566 {
02567 fs->is_reference = 3;
02568 if (p->is_long_term)
02569 {
02570 fs->is_long_term = 3;
02571 }
02572 }
02573
02574 dpb_split_field(fs);
02575 update_ref_list();
02576 update_ltref_list();
02577 }
02578 }
02579
02580
02581
02582
02583
02584
02585
02586
02587
02588
02589
02590
02591
02592
02593
02594 static void insert_picture_in_dpb(FrameStore* fs, StorablePicture* p)
02595 {
02596
02597 assert (p!=NULL);
02598 assert (fs!=NULL);
02599
02600
02601 if (p->used_for_reference)
02602 {
02603 if( IS_INDEPENDENT(params) )
02604 {
02605 UnifiedOneForthPix_JV(0, p);
02606 UnifiedOneForthPix_JV(1, p);
02607 UnifiedOneForthPix_JV(2, p);
02608 }
02609 else
02610 {
02611 UnifiedOneForthPix(p);
02612 }
02613 }
02614
02615 switch (p->structure)
02616 {
02617 case FRAME:
02618 fs->frame = p;
02619 fs->is_used = 3;
02620 if (p->used_for_reference)
02621 {
02622 fs->is_reference = 3;
02623 fs->is_orig_reference = 3;
02624 if (p->is_long_term)
02625 {
02626 fs->is_long_term = 3;
02627 fs->long_term_frame_idx = p->long_term_frame_idx;
02628 }
02629 }
02630
02631 dpb_split_field(fs);
02632 break;
02633 case TOP_FIELD:
02634 fs->top_field = p;
02635 fs->is_used |= 1;
02636 if (p->used_for_reference)
02637 {
02638 fs->is_reference |= 1;
02639 fs->is_orig_reference |= 1;
02640 if (p->is_long_term)
02641 {
02642 fs->is_long_term |= 1;
02643 fs->long_term_frame_idx = p->long_term_frame_idx;
02644 }
02645 }
02646 if (fs->is_used == 3)
02647 {
02648
02649 dpb_combine_field(fs);
02650 }
02651 else
02652 {
02653 fs->poc = p->poc;
02654 gen_field_ref_ids(p);
02655 }
02656 break;
02657 case BOTTOM_FIELD:
02658 fs->bottom_field = p;
02659 fs->is_used |= 2;
02660 if (p->used_for_reference)
02661 {
02662 fs->is_reference |= 2;
02663 fs->is_orig_reference |= 2;
02664 if (p->is_long_term)
02665 {
02666 fs->is_long_term |= 2;
02667 fs->long_term_frame_idx = p->long_term_frame_idx;
02668 }
02669 }
02670 if (fs->is_used == 3)
02671 {
02672
02673 dpb_combine_field(fs);
02674 } else
02675 {
02676 fs->poc = p->poc;
02677 gen_field_ref_ids(p);
02678 }
02679 break;
02680 }
02681 fs->frame_num = p->pic_num;
02682 fs->is_output = p->is_output;
02683
02684 }
02685
02686
02687
02688
02689
02690
02691
02692 static int is_used_for_reference(FrameStore* fs)
02693 {
02694 if (fs->is_reference)
02695 {
02696 return 1;
02697 }
02698
02699 if (fs->is_used == 3)
02700 {
02701 if (fs->frame->used_for_reference)
02702 {
02703 return 1;
02704 }
02705 }
02706
02707 if (fs->is_used & 1)
02708 {
02709 if (fs->top_field)
02710 {
02711 if (fs->top_field->used_for_reference)
02712 {
02713 return 1;
02714 }
02715 }
02716 }
02717
02718 if (fs->is_used & 2)
02719 {
02720 if (fs->bottom_field)
02721 {
02722 if (fs->bottom_field->used_for_reference)
02723 {
02724 return 1;
02725 }
02726 }
02727 }
02728 return 0;
02729 }
02730
02731
02732
02733
02734
02735
02736
02737
02738 static int is_short_term_reference(FrameStore* fs)
02739 {
02740
02741 if (fs->is_used==3)
02742 {
02743 if ((fs->frame->used_for_reference)&&(!fs->frame->is_long_term))
02744 {
02745 return 1;
02746 }
02747 }
02748
02749 if (fs->is_used & 1)
02750 {
02751 if (fs->top_field)
02752 {
02753 if ((fs->top_field->used_for_reference)&&(!fs->top_field->is_long_term))
02754 {
02755 return 1;
02756 }
02757 }
02758 }
02759
02760 if (fs->is_used & 2)
02761 {
02762 if (fs->bottom_field)
02763 {
02764 if ((fs->bottom_field->used_for_reference)&&(!fs->bottom_field->is_long_term))
02765 {
02766 return 1;
02767 }
02768 }
02769 }
02770 return 0;
02771 }
02772
02773
02774
02775
02776
02777
02778
02779
02780 static int is_long_term_reference(FrameStore* fs)
02781 {
02782
02783 if (fs->is_used==3)
02784 {
02785 if ((fs->frame->used_for_reference)&&(fs->frame->is_long_term))
02786 {
02787 return 1;
02788 }
02789 }
02790
02791 if (fs->is_used & 1)
02792 {
02793 if (fs->top_field)
02794 {
02795 if ((fs->top_field->used_for_reference)&&(fs->top_field->is_long_term))
02796 {
02797 return 1;
02798 }
02799 }
02800 }
02801
02802 if (fs->is_used & 2)
02803 {
02804 if (fs->bottom_field)
02805 {
02806 if ((fs->bottom_field->used_for_reference)&&(fs->bottom_field->is_long_term))
02807 {
02808 return 1;
02809 }
02810 }
02811 }
02812 return 0;
02813 }
02814
02815
02816
02817
02818
02819
02820
02821
02822 static void remove_frame_from_dpb(int pos)
02823 {
02824 FrameStore* fs = dpb.fs[pos];
02825 FrameStore* tmp;
02826 unsigned i;
02827
02828
02829 switch (fs->is_used)
02830 {
02831 case 3:
02832 free_storable_picture(fs->frame);
02833 free_storable_picture(fs->top_field);
02834 free_storable_picture(fs->bottom_field);
02835 fs->frame=NULL;
02836 fs->top_field=NULL;
02837 fs->bottom_field=NULL;
02838 break;
02839 case 2:
02840 free_storable_picture(fs->bottom_field);
02841 fs->bottom_field=NULL;
02842 break;
02843 case 1:
02844 free_storable_picture(fs->top_field);
02845 fs->top_field=NULL;
02846 break;
02847 case 0:
02848 break;
02849 default:
02850 error("invalid frame store type",500);
02851 }
02852 fs->is_used = 0;
02853 fs->is_long_term = 0;
02854 fs->is_reference = 0;
02855 fs->is_orig_reference = 0;
02856
02857
02858 tmp = dpb.fs[pos];
02859
02860 for (i=pos; i<dpb.used_size-1;i++)
02861 {
02862 dpb.fs[i] = dpb.fs[i+1];
02863 }
02864 dpb.fs[dpb.used_size-1] = tmp;
02865 dpb.used_size--;
02866 }
02867
02868
02869
02870
02871
02872
02873
02874 static void get_smallest_poc(int *poc,int * pos)
02875 {
02876 unsigned i;
02877
02878 if (dpb.used_size<1)
02879 {
02880 error("Cannot determine smallest POC, DPB empty.",150);
02881 }
02882
02883 *pos=-1;
02884 *poc = INT_MAX;
02885 for (i=0; i<dpb.used_size; i++)
02886 {
02887 if ((*poc>dpb.fs[i]->poc)&&(!dpb.fs[i]->is_output))
02888 {
02889 *poc = dpb.fs[i]->poc;
02890 *pos=i;
02891 }
02892 }
02893 }
02894
02895
02896
02897
02898
02899
02900
02901 static int remove_unused_frame_from_dpb(void)
02902 {
02903 unsigned i;
02904
02905
02906 for (i=0; i<dpb.used_size; i++)
02907 {
02908 if (dpb.fs[i]->is_output && (!is_used_for_reference(dpb.fs[i])))
02909 {
02910 remove_frame_from_dpb(i);
02911 return 1;
02912 }
02913 }
02914 return 0;
02915 }
02916
02917
02918
02919
02920
02921
02922
02923 static void output_one_frame_from_dpb(void)
02924 {
02925 int poc, pos;
02926
02927 if (dpb.used_size<1)
02928 {
02929 error("Cannot output frame, DPB empty.",150);
02930 }
02931
02932
02933 get_smallest_poc(&poc, &pos);
02934
02935 if(pos==-1)
02936 {
02937 error("no frames for output available", 150);
02938 }
02939
02940
02941
02942 write_stored_frame(dpb.fs[pos], p_dec);
02943
02944
02945 if(params->redundant_pic_flag == 0)
02946 {
02947 if (dpb.last_output_poc >= poc)
02948 {
02949 error ("output POC must be in ascending order", 150);
02950 }
02951 }
02952 dpb.last_output_poc = poc;
02953
02954
02955 if (!is_used_for_reference(dpb.fs[pos]))
02956 {
02957 remove_frame_from_dpb(pos);
02958 }
02959 }
02960
02961
02962
02963
02964
02965
02966
02967
02968
02969 void flush_dpb(void)
02970 {
02971 unsigned i;
02972
02973
02974
02975
02976
02977 for (i=0; i<dpb.used_size; i++)
02978 {
02979 unmark_for_reference (dpb.fs[i]);
02980 }
02981
02982 while (remove_unused_frame_from_dpb()) ;
02983
02984
02985 while (dpb.used_size)
02986 {
02987 output_one_frame_from_dpb();
02988 }
02989
02990 dpb.last_output_poc = INT_MIN;
02991 }
02992
02993
02994 void gen_field_ref_ids(StorablePicture *p)
02995 {
02996 int i,j, dummylist0, dummylist1;
02997
02998 for (i=0 ; i<p->size_x/4 ; i++)
02999 {
03000 for (j=0 ; j<p->size_y/4 ; j++)
03001 {
03002 dummylist0= p->motion.ref_idx[LIST_0][j][i];
03003 dummylist1= p->motion.ref_idx[LIST_1][j][i];
03004
03005 p->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? p->ref_pic_num[LIST_0][dummylist0] : 0;
03006 p->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? p->ref_pic_num[LIST_1][dummylist1] : 0;
03007 p->motion.field_frame[j][i]=1;
03008 }
03009 }
03010 }
03011
03012
03013
03014
03015
03016
03017
03018 void dpb_split_field(FrameStore *fs)
03019 {
03020 int i, j, k, ii, jj, jj4;
03021 int idiv,jdiv;
03022 int currentmb;
03023 int dummylist0,dummylist1;
03024 int twosz16 = 2*(fs->frame->size_x>>4);
03025
03026 fs->poc = fs->frame->poc;
03027
03028 if (!active_sps->frame_mbs_only_flag)
03029 {
03030 fs->top_field = alloc_storable_picture(TOP_FIELD, fs->frame->size_x, fs->frame->size_y/2, fs->frame->size_x_cr, fs->frame->size_y_cr/2);
03031 fs->bottom_field = alloc_storable_picture(BOTTOM_FIELD, fs->frame->size_x, fs->frame->size_y/2, fs->frame->size_x_cr, fs->frame->size_y_cr/2);
03032
03033 for (i=0; i<fs->frame->size_y/2; i++)
03034 {
03035 memcpy(fs->top_field->imgY[i], fs->frame->imgY[i*2], fs->frame->size_x*sizeof(imgpel));
03036 memcpy(fs->bottom_field->imgY[i], fs->frame->imgY[i*2 + 1], fs->frame->size_x*sizeof(imgpel));
03037 }
03038
03039 for (k = 0; k < 2; k++)
03040 {
03041 for (i=0; i<fs->frame->size_y_cr/2; i++)
03042 {
03043 memcpy(fs->top_field->imgUV[k][i], fs->frame->imgUV[k][i*2], fs->frame->size_x_cr*sizeof(imgpel));
03044 memcpy(fs->bottom_field->imgUV[k][i], fs->frame->imgUV[k][i*2 + 1], fs->frame->size_x_cr*sizeof(imgpel));
03045 }
03046 }
03047
03048 if( IS_INDEPENDENT(params) )
03049 {
03050 UnifiedOneForthPix_JV(0, fs->top_field);
03051 UnifiedOneForthPix_JV(1, fs->top_field);
03052 UnifiedOneForthPix_JV(2, fs->top_field);
03053 UnifiedOneForthPix_JV(0, fs->bottom_field);
03054 UnifiedOneForthPix_JV(1, fs->bottom_field);
03055 UnifiedOneForthPix_JV(2, fs->bottom_field);
03056 }
03057 else
03058 {
03059 UnifiedOneForthPix(fs->top_field);
03060 UnifiedOneForthPix(fs->bottom_field);
03061 }
03062
03063 fs->top_field->poc = fs->frame->top_poc;
03064 fs->bottom_field->poc = fs->frame->bottom_poc;
03065
03066 fs->top_field->frame_poc = fs->frame->frame_poc;
03067
03068 fs->top_field->bottom_poc =fs->bottom_field->bottom_poc = fs->frame->bottom_poc;
03069 fs->top_field->top_poc =fs->bottom_field->top_poc = fs->frame->top_poc;
03070 fs->bottom_field->frame_poc = fs->frame->frame_poc;
03071
03072 fs->top_field->used_for_reference = fs->bottom_field->used_for_reference
03073 = fs->frame->used_for_reference;
03074 fs->top_field->is_long_term = fs->bottom_field->is_long_term
03075 = fs->frame->is_long_term;
03076 fs->long_term_frame_idx = fs->top_field->long_term_frame_idx
03077 = fs->bottom_field->long_term_frame_idx
03078 = fs->frame->long_term_frame_idx;
03079
03080 fs->top_field->coded_frame = fs->bottom_field->coded_frame = 1;
03081 fs->top_field->MbaffFrameFlag = fs->bottom_field->MbaffFrameFlag
03082 = fs->frame->MbaffFrameFlag;
03083
03084 fs->frame->top_field = fs->top_field;
03085 fs->frame->bottom_field = fs->bottom_field;
03086
03087 fs->top_field->bottom_field = fs->bottom_field;
03088 fs->top_field->frame = fs->frame;
03089 fs->bottom_field->top_field = fs->top_field;
03090 fs->bottom_field->frame = fs->frame;
03091
03092 fs->top_field->chroma_format_idc = fs->bottom_field->chroma_format_idc = fs->frame->chroma_format_idc;
03093
03094
03095 memcpy(fs->top_field->ref_pic_num[LIST_1] , fs->frame->ref_pic_num[2 + LIST_1], 2*listXsize[LIST_1] * sizeof(int64));
03096 memcpy(fs->bottom_field->ref_pic_num[LIST_1], fs->frame->ref_pic_num[4 + LIST_1], 2*listXsize[LIST_1] * sizeof(int64));
03097 memcpy(fs->top_field->ref_pic_num[LIST_0] , fs->frame->ref_pic_num[2 + LIST_0], 2*listXsize[LIST_0] * sizeof(int64));
03098 memcpy(fs->bottom_field->ref_pic_num[LIST_0], fs->frame->ref_pic_num[4 + LIST_0], 2*listXsize[LIST_0] * sizeof(int64));
03099
03100 }
03101 else
03102 {
03103 fs->top_field=NULL;
03104 fs->bottom_field=NULL;
03105 fs->frame->top_field=NULL;
03106 fs->frame->bottom_field=NULL;
03107 }
03108
03109 if (!fs->frame->MbaffFrameFlag)
03110 {
03111 for (j=0 ; j<fs->frame->size_y/4 ; j++)
03112 {
03113 for (i=0 ; i<fs->frame->size_x/4 ; i++)
03114 {
03115 dummylist0 = fs->frame->motion.ref_idx[LIST_0][j][i];
03116 dummylist1 = fs->frame->motion.ref_idx[LIST_1][j][i];
03117 fs->frame->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? fs->frame->ref_pic_num[LIST_0][dummylist0] : -1;
03118 fs->frame->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? fs->frame->ref_pic_num[LIST_1][dummylist1] : -1;
03119 }
03120 }
03121 }
03122 else
03123 {
03124 for (j=0 ; j<fs->frame->size_y/4 ; j++)
03125 {
03126 jdiv=j/4;
03127 for (i=0 ; i<fs->frame->size_x/4 ; i++)
03128 {
03129 idiv=i/4;
03130 currentmb = twosz16*(jdiv/2)+ (idiv)*2 + (jdiv%2);
03131
03132 if (fs->frame->motion.mb_field[currentmb])
03133 {
03134 int list_offset = currentmb%2? 4: 2;
03135 dummylist0 = fs->frame->motion.ref_idx[LIST_0][j][i];
03136 dummylist1 = fs->frame->motion.ref_idx[LIST_1][j][i];
03137
03138 fs->frame->motion.ref_id[LIST_0 + list_offset][j][i] = (dummylist0>=0)? fs->frame->ref_pic_num[LIST_0 + list_offset][dummylist0] : 0;
03139 fs->frame->motion.ref_id[LIST_1 + list_offset][j][i] = (dummylist1>=0)? fs->frame->ref_pic_num[LIST_1 + list_offset][dummylist1] : 0;
03140
03141 fs->frame->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? fs->frame->frm_ref_pic_num[LIST_0 + list_offset][dummylist0] : 0;
03142 fs->frame->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? fs->frame->frm_ref_pic_num[LIST_1 + list_offset][dummylist1] : 0;
03143
03144 }
03145 else
03146 {
03147 dummylist0 = fs->frame->motion.ref_idx[LIST_0][j][i];
03148 dummylist1 = fs->frame->motion.ref_idx[LIST_1][j][i];
03149 fs->frame->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? fs->frame->ref_pic_num[LIST_0][dummylist0] : -1;
03150 fs->frame->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? fs->frame->ref_pic_num[LIST_1][dummylist1] : -1;
03151 }
03152 }
03153 }
03154 }
03155
03156 if (!active_sps->frame_mbs_only_flag && fs->frame->MbaffFrameFlag)
03157 {
03158 for (j=0 ; j<fs->frame->size_y/8; j++)
03159 {
03160 jj = (j/4)*8 + j%4;
03161 jj4 = jj + 4;
03162 jdiv=j/2;
03163 for (i=0 ; i<fs->frame->size_x/4 ; i++)
03164 {
03165 idiv=i/4;
03166
03167 currentmb = twosz16*(jdiv/2)+ (idiv)*2 + (jdiv%2);
03168
03169 if (fs->frame->motion.mb_field[currentmb])
03170 {
03171 fs->bottom_field->motion.field_frame[j][i] = fs->top_field->motion.field_frame[j][i]=1;
03172 fs->frame->motion.field_frame[2*j][i] = fs->frame->motion.field_frame[2*j+1][i]=1;
03173
03174 fs->bottom_field->motion.mv[LIST_0][j][i][0] = fs->frame->motion.mv[LIST_0][jj4][i][0];
03175 fs->bottom_field->motion.mv[LIST_0][j][i][1] = fs->frame->motion.mv[LIST_0][jj4][i][1];
03176 fs->bottom_field->motion.mv[LIST_1][j][i][0] = fs->frame->motion.mv[LIST_1][jj4][i][0];
03177 fs->bottom_field->motion.mv[LIST_1][j][i][1] = fs->frame->motion.mv[LIST_1][jj4][i][1];
03178 fs->bottom_field->motion.ref_idx[LIST_0][j][i] = fs->frame->motion.ref_idx[LIST_0][jj4][i];
03179 fs->bottom_field->motion.ref_idx[LIST_1][j][i] = fs->frame->motion.ref_idx[LIST_1][jj4][i];
03180 fs->bottom_field->motion.ref_id[LIST_0][j][i] = fs->frame->motion.ref_id[LIST_0+4][jj4][i];
03181 fs->bottom_field->motion.ref_id[LIST_1][j][i] = fs->frame->motion.ref_id[LIST_1+4][jj4][i];
03182
03183
03184 fs->top_field->motion.mv[LIST_0][j][i][0] = fs->frame->motion.mv[LIST_0][jj][i][0];
03185 fs->top_field->motion.mv[LIST_0][j][i][1] = fs->frame->motion.mv[LIST_0][jj][i][1];
03186 fs->top_field->motion.mv[LIST_1][j][i][0] = fs->frame->motion.mv[LIST_1][jj][i][0];
03187 fs->top_field->motion.mv[LIST_1][j][i][1] = fs->frame->motion.mv[LIST_1][jj][i][1];
03188 fs->top_field->motion.ref_idx[LIST_0][j][i] = fs->frame->motion.ref_idx[LIST_0][jj][i];
03189 fs->top_field->motion.ref_idx[LIST_1][j][i] = fs->frame->motion.ref_idx[LIST_1][jj][i];
03190 fs->top_field->motion.ref_id[LIST_0][j][i] = fs->frame->motion.ref_id[LIST_0+2][jj][i];
03191 fs->top_field->motion.ref_id[LIST_1][j][i] = fs->frame->motion.ref_id[LIST_1+2][jj][i];
03192 }
03193 }
03194 }
03195 }
03196
03197
03198 if (!active_sps->frame_mbs_only_flag)
03199 {
03200 for (j=0 ; j<fs->frame->size_y/8 ; j++)
03201 {
03202 jj = 2* RSD(j);
03203 jdiv = j/2;
03204 for (i=0 ; i<fs->frame->size_x/4 ; i++)
03205 {
03206 ii = RSD(i);
03207 idiv = i/4;
03208
03209 currentmb = twosz16*(jdiv/2)+ (idiv)*2 + (jdiv%2);
03210
03211 if (!fs->frame->MbaffFrameFlag || !fs->frame->motion.mb_field[currentmb])
03212 {
03213 fs->frame->motion.field_frame[2*j+1][i] = fs->frame->motion.field_frame[2*j][i]=0;
03214
03215 fs->top_field->motion.field_frame[j][i] = fs->bottom_field->motion.field_frame[j][i] = 0;
03216
03217 fs->top_field->motion.mv[LIST_0][j][i][0] = fs->bottom_field->motion.mv[LIST_0][j][i][0] = fs->frame->motion.mv[LIST_0][jj][ii][0];
03218 fs->top_field->motion.mv[LIST_0][j][i][1] = fs->bottom_field->motion.mv[LIST_0][j][i][1] = fs->frame->motion.mv[LIST_0][jj][ii][1];
03219 fs->top_field->motion.mv[LIST_1][j][i][0] = fs->bottom_field->motion.mv[LIST_1][j][i][0] = fs->frame->motion.mv[LIST_1][jj][ii][0];
03220 fs->top_field->motion.mv[LIST_1][j][i][1] = fs->bottom_field->motion.mv[LIST_1][j][i][1] = fs->frame->motion.mv[LIST_1][jj][ii][1];
03221
03222
03223 if (fs->frame->motion.ref_idx[LIST_0][jj][ii] == -1)
03224 fs->top_field->motion.ref_idx[LIST_0][j][i] = fs->bottom_field->motion.ref_idx[LIST_0][j][i] = - 1;
03225 else
03226 {
03227 dummylist0=fs->top_field->motion.ref_idx[LIST_0][j][i] = fs->bottom_field->motion.ref_idx[LIST_0][j][i] = fs->frame->motion.ref_idx[LIST_0][jj][ii];
03228 fs->top_field ->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? fs->frame->top_ref_pic_num[LIST_0][dummylist0] : 0;
03229 fs->bottom_field->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? fs->frame->bottom_ref_pic_num[LIST_0][dummylist0] : 0;
03230 }
03231
03232 if (fs->frame->motion.ref_idx[LIST_1][jj][ii] == -1)
03233 fs->top_field->motion.ref_idx[LIST_1][j][i] = fs->bottom_field->motion.ref_idx[LIST_1][j][i] = - 1;
03234 else
03235 {
03236 dummylist1=fs->top_field->motion.ref_idx[LIST_1][j][i] = fs->bottom_field->motion.ref_idx[LIST_1][j][i] = fs->frame->motion.ref_idx[LIST_1][jj][ii];
03237
03238 fs->top_field ->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? fs->frame->top_ref_pic_num[LIST_1][dummylist1] : 0;
03239 fs->bottom_field->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? fs->frame->bottom_ref_pic_num[LIST_1][dummylist1] : 0;
03240 }
03241 }
03242 else
03243 {
03244 fs->frame->motion.field_frame[2*j+1][i] = fs->frame->motion.field_frame[2*j][i]= fs->frame->motion.mb_field[currentmb];
03245 }
03246 }
03247 }
03248 }
03249 else
03250 {
03251 memset( &(fs->frame->motion.field_frame[0][0]), 0, fs->frame->size_y * (fs->frame->size_x >>4) * sizeof(byte));
03252 }
03253 }
03254
03255
03256
03257
03258
03259
03260
03261
03262
03263 void dpb_combine_field_yuv(FrameStore *fs)
03264 {
03265 int i, j;
03266
03267 fs->frame = alloc_storable_picture(FRAME, fs->top_field->size_x, fs->top_field->size_y*2, fs->top_field->size_x_cr, fs->top_field->size_y_cr*2);
03268
03269 for (i=0; i<fs->top_field->size_y; i++)
03270 {
03271 memcpy(fs->frame->imgY[i*2], fs->top_field->imgY[i] , fs->top_field->size_x*sizeof(imgpel));
03272 memcpy(fs->frame->imgY[i*2 + 1], fs->bottom_field->imgY[i], fs->bottom_field->size_x*sizeof(imgpel));
03273 }
03274
03275 for (j = 0; j < 2; j++)
03276 {
03277 for (i=0; i<fs->top_field->size_y_cr; i++)
03278 {
03279 memcpy(fs->frame->imgUV[j][i*2], fs->top_field->imgUV[j][i], fs->top_field->size_x_cr*sizeof(imgpel));
03280 memcpy(fs->frame->imgUV[j][i*2 + 1], fs->bottom_field->imgUV[j][i], fs->bottom_field->size_x_cr*sizeof(imgpel));
03281 }
03282 }
03283
03284 fs->poc=fs->frame->poc =fs->frame->frame_poc = imin (fs->top_field->poc, fs->bottom_field->poc);
03285
03286 fs->bottom_field->frame_poc=fs->top_field->frame_poc=fs->frame->poc;
03287
03288 fs->bottom_field->top_poc=fs->frame->top_poc=fs->top_field->poc;
03289 fs->top_field->bottom_poc=fs->frame->bottom_poc=fs->bottom_field->poc;
03290
03291 fs->frame->used_for_reference = (fs->top_field->used_for_reference && fs->bottom_field->used_for_reference );
03292 fs->frame->is_long_term = (fs->top_field->is_long_term && fs->bottom_field->is_long_term );
03293
03294 if (fs->frame->is_long_term)
03295 fs->frame->long_term_frame_idx = fs->long_term_frame_idx;
03296
03297 fs->frame->top_field = fs->top_field;
03298 fs->frame->bottom_field = fs->bottom_field;
03299
03300 fs->frame->coded_frame = 0;
03301
03302 fs->frame->chroma_format_idc = fs->top_field->chroma_format_idc;
03303 fs->frame->frame_cropping_flag = fs->top_field->frame_cropping_flag;
03304 if (fs->frame->frame_cropping_flag)
03305 {
03306 fs->frame->frame_cropping_rect_top_offset = fs->top_field->frame_cropping_rect_top_offset;
03307 fs->frame->frame_cropping_rect_bottom_offset = fs->top_field->frame_cropping_rect_bottom_offset;
03308 fs->frame->frame_cropping_rect_left_offset = fs->top_field->frame_cropping_rect_left_offset;
03309 fs->frame->frame_cropping_rect_right_offset = fs->top_field->frame_cropping_rect_right_offset;
03310 }
03311
03312 fs->top_field->frame = fs->bottom_field->frame = fs->frame;
03313 }
03314
03315
03316
03317
03318
03319
03320
03321
03322 void dpb_combine_field(FrameStore *fs)
03323 {
03324 int i,j, jj, jj4;
03325 int dummylist0, dummylist1;
03326
03327 dpb_combine_field_yuv(fs);
03328
03329 if( IS_INDEPENDENT(params) )
03330 {
03331 UnifiedOneForthPix_JV(0, fs->frame);
03332 UnifiedOneForthPix_JV(1, fs->frame);
03333 UnifiedOneForthPix_JV(2, fs->frame);
03334 }
03335 else
03336 {
03337 UnifiedOneForthPix(fs->frame);
03338 }
03339
03340
03341 for (i=0;i<(listXsize[LIST_1]+1)/2;i++)
03342 {
03343 fs->frame->ref_pic_num[LIST_1][i]= i64min ((fs->top_field->ref_pic_num[LIST_1][2*i]/2)*2, (fs->bottom_field->ref_pic_num[LIST_1][2*i]/2)*2);
03344 }
03345
03346 for (i=0;i<(listXsize[LIST_0]+1)/2;i++)
03347 {
03348 fs->frame->ref_pic_num[LIST_0][i]= i64min ((fs->top_field->ref_pic_num[LIST_0][2*i]/2)*2, (fs->bottom_field->ref_pic_num[LIST_0][2*i]/2)*2);
03349 }
03350
03351
03352
03353
03354 for (j=0 ; j<fs->top_field->size_y/4 ; j++)
03355 {
03356 jj = 8*(j/4) + (j%4);
03357 jj4 = jj + 4;
03358 for (i=0 ; i<fs->top_field->size_x/4 ; i++)
03359 {
03360 fs->frame->motion.field_frame[jj][i]= fs->frame->motion.field_frame[jj4][i]=1;
03361
03362 fs->frame->motion.mv[LIST_0][jj][i][0] = fs->top_field->motion.mv[LIST_0][j][i][0];
03363 fs->frame->motion.mv[LIST_0][jj][i][1] = fs->top_field->motion.mv[LIST_0][j][i][1] ;
03364 fs->frame->motion.mv[LIST_1][jj][i][0] = fs->top_field->motion.mv[LIST_1][j][i][0];
03365 fs->frame->motion.mv[LIST_1][jj][i][1] = fs->top_field->motion.mv[LIST_1][j][i][1] ;
03366
03367 dummylist0=fs->frame->motion.ref_idx[LIST_0][jj][i] = fs->top_field->motion.ref_idx[LIST_0][j][i];
03368 dummylist1=fs->frame->motion.ref_idx[LIST_1][jj][i] = fs->top_field->motion.ref_idx[LIST_1][j][i];
03369
03370
03371 fs->top_field->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? fs->top_field->ref_pic_num[LIST_0][dummylist0] : 0;
03372 fs->top_field->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? fs->top_field->ref_pic_num[LIST_1][dummylist1] : 0;
03373
03374
03375 fs->frame->motion.ref_id[LIST_0][jj][i] = (dummylist0>=0)? fs->top_field->frm_ref_pic_num[LIST_0][dummylist0] : 0;
03376 fs->frame->motion.ref_id[LIST_1][jj][i] = (dummylist1>=0)? fs->top_field->frm_ref_pic_num[LIST_1][dummylist1] : 0;
03377
03378 fs->frame->motion.mv[LIST_0][jj4][i][0] = fs->bottom_field->motion.mv[LIST_0][j][i][0];
03379 fs->frame->motion.mv[LIST_0][jj4][i][1] = fs->bottom_field->motion.mv[LIST_0][j][i][1] ;
03380 fs->frame->motion.mv[LIST_1][jj4][i][0] = fs->bottom_field->motion.mv[LIST_1][j][i][0];
03381 fs->frame->motion.mv[LIST_1][jj4][i][1] = fs->bottom_field->motion.mv[LIST_1][j][i][1] ;
03382
03383 dummylist0=fs->frame->motion.ref_idx[LIST_0][jj4][i] = fs->bottom_field->motion.ref_idx[LIST_0][j][i];
03384 dummylist1=fs->frame->motion.ref_idx[LIST_1][jj4][i] = fs->bottom_field->motion.ref_idx[LIST_1][j][i];
03385
03386 fs->bottom_field->motion.ref_id[LIST_0][j][i] = (dummylist0>=0)? fs->bottom_field->ref_pic_num[LIST_0][dummylist0] : 0;
03387 fs->bottom_field->motion.ref_id[LIST_1][j][i] = (dummylist1>=0)? fs->bottom_field->ref_pic_num[LIST_1][dummylist1] : 0;
03388
03389
03390 fs->frame->motion.ref_id[LIST_0][jj4][i] = (dummylist0>=0)? fs->bottom_field->frm_ref_pic_num[LIST_0][dummylist0] : -1;
03391 fs->frame->motion.ref_id[LIST_1][jj4][i] = (dummylist1>=0)? fs->bottom_field->frm_ref_pic_num[LIST_1][dummylist1] : -1;
03392
03393 fs->top_field->motion.field_frame[j][i]=1;
03394 fs->bottom_field->motion.field_frame[j][i]=1;
03395 }
03396 }
03397 }
03398
03399
03400
03401
03402
03403
03404
03405
03406 void alloc_ref_pic_list_reordering_buffer(Slice *currSlice)
03407 {
03408 int size = img->num_ref_idx_l0_active+1;
03409
03410 if (img->type!=I_SLICE && img->type!=SI_SLICE)
03411 {
03412 if ((currSlice->reordering_of_pic_nums_idc_l0 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: remapping_of_pic_nums_idc_l0");
03413 if ((currSlice->abs_diff_pic_num_minus1_l0 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: abs_diff_pic_num_minus1_l0");
03414 if ((currSlice->long_term_pic_idx_l0 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: long_term_pic_idx_l0");
03415 }
03416 else
03417 {
03418 currSlice->reordering_of_pic_nums_idc_l0 = NULL;
03419 currSlice->abs_diff_pic_num_minus1_l0 = NULL;
03420 currSlice->long_term_pic_idx_l0 = NULL;
03421 }
03422
03423 size = img->num_ref_idx_l1_active+1;
03424
03425 if (img->type==B_SLICE)
03426 {
03427 if ((currSlice->reordering_of_pic_nums_idc_l1 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: remapping_of_pic_nums_idc_l1");
03428 if ((currSlice->abs_diff_pic_num_minus1_l1 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: abs_diff_pic_num_minus1_l1");
03429 if ((currSlice->long_term_pic_idx_l1 = calloc(size,sizeof(int)))==NULL) no_mem_exit("alloc_ref_pic_list_reordering_buffer: long_term_pic_idx_l1");
03430 }
03431 else
03432 {
03433 currSlice->reordering_of_pic_nums_idc_l1 = NULL;
03434 currSlice->abs_diff_pic_num_minus1_l1 = NULL;
03435 currSlice->long_term_pic_idx_l1 = NULL;
03436 }
03437 }
03438
03439
03440
03441
03442
03443
03444
03445
03446 void free_ref_pic_list_reordering_buffer(Slice *currSlice)
03447 {
03448
03449 if (currSlice->reordering_of_pic_nums_idc_l0)
03450 free(currSlice->reordering_of_pic_nums_idc_l0);
03451 if (currSlice->abs_diff_pic_num_minus1_l0)
03452 free(currSlice->abs_diff_pic_num_minus1_l0);
03453 if (currSlice->long_term_pic_idx_l0)
03454 free(currSlice->long_term_pic_idx_l0);
03455
03456 currSlice->reordering_of_pic_nums_idc_l0 = NULL;
03457 currSlice->abs_diff_pic_num_minus1_l0 = NULL;
03458 currSlice->long_term_pic_idx_l0 = NULL;
03459
03460 if (currSlice->reordering_of_pic_nums_idc_l1)
03461 free(currSlice->reordering_of_pic_nums_idc_l1);
03462 if (currSlice->abs_diff_pic_num_minus1_l1)
03463 free(currSlice->abs_diff_pic_num_minus1_l1);
03464 if (currSlice->long_term_pic_idx_l1)
03465 free(currSlice->long_term_pic_idx_l1);
03466
03467 currSlice->reordering_of_pic_nums_idc_l1 = NULL;
03468 currSlice->abs_diff_pic_num_minus1_l1 = NULL;
03469 currSlice->long_term_pic_idx_l1 = NULL;
03470 }
03471
03472
03473
03474
03475
03476
03477
03478
03479
03480
03481
03482
03483 void fill_frame_num_gap(ImageParameters *img)
03484 {
03485 int CurrFrameNum;
03486 int UnusedShortTermFrameNum;
03487 StorablePicture *picture = NULL;
03488 int nal_ref_idc_bak;
03489
03490
03491
03492 nal_ref_idc_bak = img->nal_reference_idc;
03493 img->nal_reference_idc = NALU_PRIORITY_LOW;
03494
03495 UnusedShortTermFrameNum = (img->pre_frame_num + 1) % max_frame_num;
03496 CurrFrameNum = img->frame_num;
03497
03498 while (CurrFrameNum != UnusedShortTermFrameNum)
03499 {
03500 picture = alloc_storable_picture (FRAME, img->width, img->height, img->width_cr, img->height_cr);
03501 picture->coded_frame = 1;
03502 picture->pic_num = UnusedShortTermFrameNum;
03503 picture->non_existing = 1;
03504 picture->is_output = 1;
03505
03506 img->adaptive_ref_pic_buffering_flag = 0;
03507
03508 store_picture_in_dpb(picture);
03509
03510 picture=NULL;
03511 UnusedShortTermFrameNum = (UnusedShortTermFrameNum + 1) % max_frame_num;
03512 }
03513
03514 img->nal_reference_idc = nal_ref_idc_bak;
03515 }
03516
03517
03518
03519
03520
03521
03522
03523
03524 void alloc_motion_params(MotionParams *ftype, int size_y, int size_x)
03525 {
03526 get_mem3Dint64 (&(ftype->ref_pic_id), 2, size_y, size_x);
03527 get_mem4Dshort (&(ftype->mv) , 2, size_y, size_x, 2);
03528 get_mem3D ((byte****)(&(ftype->ref_idx)) , 2, size_y, size_x);
03529 get_mem2D (&(ftype->moving_block) , size_y, size_x);
03530 }
03531
03532
03533
03534
03535
03536
03537
03538
03539
03540
03541
03542
03543
03544
03545
03546
03547
03548 ColocatedParams* alloc_colocated(int size_x, int size_y, int mb_adaptive_frame_field_flag)
03549 {
03550 ColocatedParams *s;
03551
03552 s = calloc(1, sizeof(ColocatedParams));
03553 if (NULL == s)
03554 no_mem_exit("alloc_colocated: s");
03555
03556 s->size_x = size_x;
03557 s->size_y = size_y;
03558
03559 alloc_motion_params(&s->frame, size_y / BLOCK_SIZE, size_x / BLOCK_SIZE);
03560
03561 if (mb_adaptive_frame_field_flag)
03562 {
03563 alloc_motion_params(&s->top , size_y / (BLOCK_SIZE * 2), size_x / BLOCK_SIZE);
03564 alloc_motion_params(&s->bottom, size_y / (BLOCK_SIZE * 2), size_x / BLOCK_SIZE);
03565 }
03566
03567 s->mb_adaptive_frame_field_flag = mb_adaptive_frame_field_flag;
03568
03569 return s;
03570 }
03571
03572
03573
03574
03575
03576
03577
03578
03579
03580 void free_motion_params(MotionParams *ftype)
03581 {
03582 free_mem3Dint64 (ftype->ref_pic_id);
03583 free_mem3D ((byte***)ftype->ref_idx);
03584 free_mem4Dshort (ftype->mv);
03585
03586 if (ftype->moving_block)
03587 {
03588 free_mem2D (ftype->moving_block);
03589 ftype->moving_block=NULL;
03590 }
03591 }
03592
03593
03594
03595
03596
03597
03598
03599
03600
03601
03602
03603 void free_colocated(ColocatedParams* p)
03604 {
03605 if (p)
03606 {
03607 free_motion_params(&p->frame);
03608
03609 if (p->mb_adaptive_frame_field_flag)
03610 {
03611 free_motion_params(&p->top );
03612 free_motion_params(&p->bottom);
03613 }
03614
03615 free(p);
03616
03617 p=NULL;
03618 }
03619 }
03620
03621
03622
03623
03624
03625
03626
03627
03628
03629 void compute_colocated(ColocatedParams* p, StorablePicture **listX[6])
03630 {
03631 StorablePicture *fs, *fs_top, *fs_bottom;
03632 MotionParams *ftype = NULL;
03633 int i,j, ii, jj, jdiv;
03634
03635 fs_top = fs_bottom = fs = listX[LIST_1 ][0];
03636
03637 if (img->MbaffFrameFlag)
03638 {
03639 fs_top= listX[LIST_1 + 2][0];
03640 fs_bottom= listX[LIST_1 + 4][0];
03641 }
03642 else
03643 {
03644 if (img->structure!=FRAME)
03645 {
03646 if ((img->structure != fs->structure) && (fs->coded_frame))
03647 {
03648 if (img->structure==TOP_FIELD)
03649 {
03650 fs_top = fs_bottom = fs = listX[LIST_1 ][0]->top_field;
03651 }
03652 else
03653 {
03654 fs_top = fs_bottom = fs = listX[LIST_1 ][0]->bottom_field;
03655 }
03656 }
03657 }
03658 }
03659
03660 if (!active_sps->frame_mbs_only_flag || active_sps->direct_8x8_inference_flag)
03661 {
03662 ftype = &p->frame;
03663 for (j=0 ; j<fs->size_y/4 ; j++)
03664 {
03665 jdiv = j>>1;
03666 jj = j/2 + 4 * (j/8);
03667 for (i=0 ; i<fs->size_x/4 ; i++)
03668 {
03669
03670 if (img->MbaffFrameFlag && fs->motion.field_frame[j][i])
03671 {
03672
03673
03674
03675
03676 if (iabs(enc_picture->poc - fs_bottom->poc) > iabs(enc_picture->poc - fs_top->poc) )
03677 {
03678 ftype->mv[LIST_0][j][i][0] = fs_top->motion.mv[LIST_0][jdiv][i][0];
03679 ftype->mv[LIST_0][j][i][1] = fs_top->motion.mv[LIST_0][jdiv][i][1] ;
03680 ftype->mv[LIST_1][j][i][0] = fs_top->motion.mv[LIST_1][jdiv][i][0];
03681 ftype->mv[LIST_1][j][i][1] = fs_top->motion.mv[LIST_1][jdiv][i][1] ;
03682 ftype->ref_idx[LIST_0][j][i] = fs_top->motion.ref_idx[LIST_0][jdiv][i];
03683 ftype->ref_idx[LIST_1][j][i] = fs_top->motion.ref_idx[LIST_1][jdiv][i];
03684 ftype->ref_pic_id[LIST_0][j][i] = fs->motion.ref_id[LIST_0][jj][i];
03685 ftype->ref_pic_id[LIST_1][j][i] = fs->motion.ref_id[LIST_1][jj][i];
03686
03687 p->is_long_term = fs_top->is_long_term;
03688 }
03689 else
03690 {
03691 ftype->mv[LIST_0][j][i][0] = fs_bottom->motion.mv[LIST_0][jdiv][i][0];
03692 ftype->mv[LIST_0][j][i][1] = fs_bottom->motion.mv[LIST_0][jdiv][i][1] ;
03693 ftype->mv[LIST_1][j][i][0] = fs_bottom->motion.mv[LIST_1][jdiv][i][0];
03694 ftype->mv[LIST_1][j][i][1] = fs_bottom->motion.mv[LIST_1][jdiv][i][1] ;
03695 ftype->ref_idx[LIST_0][j][i] = fs_bottom->motion.ref_idx[LIST_0][jdiv][i];
03696 ftype->ref_idx[LIST_1][j][i] = fs_bottom->motion.ref_idx[LIST_1][jdiv][i];
03697 ftype->ref_pic_id[LIST_0][j][i] = fs->motion.ref_id[LIST_0][jj + 4][i];
03698 ftype->ref_pic_id[LIST_1][j][i] = fs->motion.ref_id[LIST_1][jj + 4][i];
03699
03700 p->is_long_term = fs_bottom->is_long_term;
03701 }
03702 }
03703 else
03704 {
03705 ftype->mv[LIST_0][j][i][0] = fs->motion.mv[LIST_0][j][i][0];
03706 ftype->mv[LIST_0][j][i][1] = fs->motion.mv[LIST_0][j][i][1] ;
03707 ftype->mv[LIST_1][j][i][0] = fs->motion.mv[LIST_1][j][i][0];
03708 ftype->mv[LIST_1][j][i][1] = fs->motion.mv[LIST_1][j][i][1] ;
03709 ftype->ref_idx[LIST_0][j][i] = fs->motion.ref_idx[LIST_0][j][i];
03710 ftype->ref_idx[LIST_1][j][i] = fs->motion.ref_idx[LIST_1][j][i];
03711 ftype->ref_pic_id[LIST_0][j][i] = fs->motion.ref_id[LIST_0][j][i];
03712 ftype->ref_pic_id[LIST_1][j][i] = fs->motion.ref_id[LIST_1][j][i];
03713
03714 p->is_long_term = fs->is_long_term;
03715 }
03716 }
03717 }
03718 }
03719
03720
03721
03722 if (img->structure || img->MbaffFrameFlag)
03723 {
03724 ftype = &p->frame;
03725 for (j=0 ; j<fs->size_y/8 ; j++)
03726 {
03727 jj = RSD(j);
03728 for (i=0 ; i<fs->size_x/4 ; i++)
03729 {
03730 ii = RSD(i);
03731
03732 if (!img->MbaffFrameFlag )
03733 {
03734 ftype->mv[LIST_0][j][i][0] = fs->motion.mv[LIST_0][jj][ii][0];
03735 ftype->mv[LIST_0][j][i][1] = fs->motion.mv[LIST_0][jj][ii][1];
03736 ftype->mv[LIST_1][j][i][0] = fs->motion.mv[LIST_1][jj][ii][0];
03737 ftype->mv[LIST_1][j][i][1] = fs->motion.mv[LIST_1][jj][ii][1];
03738
03739
03740
03741 if (fs->motion.ref_idx[LIST_0][jj][ii] == -1)
03742 {
03743 ftype->ref_idx [LIST_0][j][i] = -1;
03744 ftype->ref_pic_id[LIST_0][j][i] = -1;
03745 }
03746 else
03747 {
03748 ftype->ref_idx [LIST_0][j][i] = fs->motion.ref_idx[LIST_0][jj][ii] ;
03749 ftype->ref_pic_id[LIST_0][j][i] = fs->motion.ref_id [LIST_0][jj][ii];
03750 }
03751
03752 if (fs->motion.ref_idx[LIST_1][jj][ii] == -1)
03753 {
03754 ftype->ref_idx [LIST_1][j][i] = -1;
03755 ftype->ref_pic_id[LIST_1][j][i] = -1;
03756 }
03757 else
03758 {
03759 ftype->ref_idx [LIST_1][j][i] = fs->motion.ref_idx[LIST_1][jj][ii];
03760 ftype->ref_pic_id[LIST_1][j][i] = fs->motion.ref_id [LIST_1][jj][ii];
03761 }
03762
03763 p->is_long_term = fs->is_long_term;
03764
03765 if (img->direct_spatial_mv_pred_flag == 1)
03766 {
03767 ftype->moving_block[j][i] =
03768 !((!p->is_long_term
03769 && ((ftype->ref_idx[LIST_0][j][i] == 0)
03770 && (iabs(ftype->mv[LIST_0][j][i][0])>>1 == 0)
03771 && (iabs(ftype->mv[LIST_0][j][i][1])>>1 == 0)))
03772 || ((ftype->ref_idx[LIST_0][j][i] == -1)
03773 && (ftype->ref_idx[LIST_1][j][i] == 0)
03774 && (iabs(ftype->mv[LIST_1][j][i][0])>>1 == 0)
03775 && (iabs(ftype->mv[LIST_1][j][i][1])>>1 == 0)));
03776 }
03777 }
03778 else
03779 {
03780 p->bottom.mv[LIST_0][j][i][0] = fs_bottom->motion.mv[LIST_0][jj][ii][0];
03781 p->bottom.mv[LIST_0][j][i][1] = fs_bottom->motion.mv[LIST_0][jj][ii][1];
03782 p->bottom.mv[LIST_1][j][i][0] = fs_bottom->motion.mv[LIST_1][jj][ii][0];
03783 p->bottom.mv[LIST_1][j][i][1] = fs_bottom->motion.mv[LIST_1][jj][ii][1];
03784 p->bottom.ref_idx[LIST_0][j][i] = fs_bottom->motion.ref_idx[LIST_0][jj][ii];
03785 p->bottom.ref_idx[LIST_1][j][i] = fs_bottom->motion.ref_idx[LIST_1][jj][ii];
03786 p->bottom.ref_pic_id[LIST_0][j][i] = fs_bottom->motion.ref_id[LIST_0][jj][ii];
03787 p->bottom.ref_pic_id[LIST_1][j][i] = fs_bottom->motion.ref_id[LIST_1][jj][ii];
03788
03789 if (img->direct_spatial_mv_pred_flag == 1)
03790 {
03791 p->bottom.moving_block[j][i] =
03792 !((!fs_bottom->is_long_term
03793 && ((p->bottom.ref_idx[LIST_0][j][i] == 0)
03794 && (iabs(p->bottom.mv[LIST_0][j][i][0])>>1 == 0)
03795 && (iabs(p->bottom.mv[LIST_0][j][i][1])>>1 == 0)))
03796 || ((p->bottom.ref_idx[LIST_0][j][i] == -1)
03797 && (p->bottom.ref_idx[LIST_1][j][i] == 0)
03798 && (iabs(p->bottom.mv[LIST_1][j][i][0])>>1 == 0)
03799 && (iabs(p->bottom.mv[LIST_1][j][i][1])>>1 == 0)));
03800 }
03801
03802 p->top.mv[LIST_0][j][i][0] = fs_top->motion.mv[LIST_0][jj][ii][0];
03803 p->top.mv[LIST_0][j][i][1] = fs_top->motion.mv[LIST_0][jj][ii][1];
03804 p->top.mv[LIST_1][j][i][0] = fs_top->motion.mv[LIST_1][jj][ii][0];
03805 p->top.mv[LIST_1][j][i][1] = fs_top->motion.mv[LIST_1][jj][ii][1];
03806 p->top.ref_idx[LIST_0][j][i] = fs_top->motion.ref_idx[LIST_0][jj][ii];
03807 p->top.ref_idx[LIST_1][j][i] = fs_top->motion.ref_idx[LIST_1][jj][ii];
03808 p->top.ref_pic_id[LIST_0][j][i] = fs_top->motion.ref_id[LIST_0][jj][ii];
03809 p->top.ref_pic_id[LIST_1][j][i] = fs_top->motion.ref_id[LIST_1][jj][ii];
03810
03811 if (img->direct_spatial_mv_pred_flag == 1)
03812 {
03813 p->top.moving_block[j][i] =
03814 !((!fs_top->is_long_term
03815 && ((p->top.ref_idx[LIST_0][j][i] == 0)
03816 && (iabs(p->top.mv[LIST_0][j][i][0])>>1 == 0)
03817 && (iabs(p->top.mv[LIST_0][j][i][1])>>1 == 0)))
03818 || ((p->top.ref_idx[LIST_0][j][i] == -1)
03819 && (p->top.ref_idx[LIST_1][j][i] == 0)
03820 && (iabs(p->top.mv[LIST_1][j][i][0])>>1 == 0)
03821 && (iabs(p->top.mv[LIST_1][j][i][1])>>1 == 0)));
03822 }
03823
03824 if ((img->direct_spatial_mv_pred_flag == 0 ) && !fs->motion.field_frame[2*j][i])
03825 {
03826 p->top.mv[LIST_0][j][i][1] /= 2;
03827 p->top.mv[LIST_1][j][i][1] /= 2;
03828 p->bottom.mv[LIST_0][j][i][1] /= 2;
03829 p->bottom.mv[LIST_1][j][i][1] /= 2;
03830 }
03831
03832 }
03833 }
03834 }
03835 }
03836
03837
03838 if (!active_sps->frame_mbs_only_flag || active_sps->direct_8x8_inference_flag)
03839 {
03840
03841
03842
03843 if (!img->structure)
03844 {
03845 ftype = &p->frame;
03846 for (j=0 ; j < (fs->size_y>>2) ; j++)
03847 {
03848 jdiv = j>>1;
03849 jj = (j>>1) + 4*(j>>3);
03850 for (i=0 ; i < (fs->size_x>>2) ; i++)
03851 {
03852
03853 if (fs->motion.field_frame[j][i])
03854 {
03855 if (iabs(enc_picture->poc - fs->bottom_field->poc) > iabs(enc_picture->poc - fs->top_field->poc))
03856 {
03857 ftype->mv[LIST_0][j][i][0] = fs->top_field->motion.mv[LIST_0][jdiv][i][0];
03858 ftype->mv[LIST_0][j][i][1] = fs->top_field->motion.mv[LIST_0][jdiv][i][1] ;
03859 ftype->mv[LIST_1][j][i][0] = fs->top_field->motion.mv[LIST_1][jdiv][i][0];
03860 ftype->mv[LIST_1][j][i][1] = fs->top_field->motion.mv[LIST_1][jdiv][i][1] ;
03861
03862 ftype->ref_idx[LIST_0][j][i] = fs->top_field->motion.ref_idx[LIST_0][jdiv][i];
03863 ftype->ref_idx[LIST_1][j][i] = fs->top_field->motion.ref_idx[LIST_1][jdiv][i];
03864 ftype->ref_pic_id[LIST_0][j][i] = fs->motion.ref_id[LIST_0][jj][i];
03865 ftype->ref_pic_id[LIST_1][j][i] = fs->motion.ref_id[LIST_1][jj][i];
03866 p->is_long_term = fs->top_field->is_long_term;
03867 }
03868 else
03869 {
03870 ftype->mv[LIST_0][j][i][0] = fs->bottom_field->motion.mv[LIST_0][jdiv][i][0];
03871 ftype->mv[LIST_0][j][i][1] = fs->bottom_field->motion.mv[LIST_0][jdiv][i][1] ;
03872 ftype->mv[LIST_1][j][i][0] = fs->bottom_field->motion.mv[LIST_1][jdiv][i][0];
03873 ftype->mv[LIST_1][j][i][1] = fs->bottom_field->motion.mv[LIST_1][jdiv][i][1] ;
03874
03875 ftype->ref_idx[LIST_0][j][i] = fs->bottom_field->motion.ref_idx[LIST_0][jdiv][i];
03876 ftype->ref_idx[LIST_1][j][i] = fs->bottom_field->motion.ref_idx[LIST_1][jdiv][i];
03877 ftype->ref_pic_id[LIST_0][j][i] = fs->motion.ref_id[LIST_0][jj + 4][i];
03878 ftype->ref_pic_id[LIST_1][j][i] = fs->motion.ref_id[LIST_1][jj + 4][i];
03879 p->is_long_term = fs->bottom_field->is_long_term;
03880 }
03881 }
03882 }
03883 }
03884 }
03885 }
03886
03887
03888 p->is_long_term = fs->is_long_term;
03889
03890 if (!active_sps->frame_mbs_only_flag || active_sps->direct_8x8_inference_flag)
03891 {
03892 ftype = &p->frame;
03893 for (j=0 ; j < (fs->size_y>>2) ; j++)
03894 {
03895 jj = RSD(j);
03896 for (i=0 ; i < (fs->size_x>>2) ; i++)
03897 {
03898 ii = RSD(i);
03899
03900 ftype->mv[LIST_0][j][i][0]=ftype->mv[LIST_0][jj][ii][0];
03901 ftype->mv[LIST_0][j][i][1]=ftype->mv[LIST_0][jj][ii][1];
03902 ftype->mv[LIST_1][j][i][0]=ftype->mv[LIST_1][jj][ii][0];
03903 ftype->mv[LIST_1][j][i][1]=ftype->mv[LIST_1][jj][ii][1];
03904
03905 ftype->ref_idx[LIST_0][j][i]=ftype->ref_idx[LIST_0][jj][ii];
03906 ftype->ref_idx[LIST_1][j][i]=ftype->ref_idx[LIST_1][jj][ii];
03907 ftype->ref_pic_id[LIST_0][j][i] = ftype->ref_pic_id[LIST_0][jj][ii];
03908 ftype->ref_pic_id[LIST_1][j][i] = ftype->ref_pic_id[LIST_1][jj][ii];
03909
03910 if (img->direct_spatial_mv_pred_flag == 1)
03911 {
03912 ftype->moving_block[j][i]=
03913 !((!p->is_long_term
03914 && ((ftype->ref_idx[LIST_0][j][i] == 0)
03915 && (iabs(ftype->mv[LIST_0][j][i][0])>>1 == 0)
03916 && (iabs(ftype->mv[LIST_0][j][i][1])>>1 == 0)))
03917 || ((ftype->ref_idx[LIST_0][j][i] == -1)
03918 && (ftype->ref_idx[LIST_1][j][i] == 0)
03919 && (iabs(ftype->mv[LIST_1][j][i][0])>>1 == 0)
03920 && (iabs(ftype->mv[LIST_1][j][i][1])>>1 == 0)));
03921 }
03922 }
03923 }
03924 }
03925 else
03926 {
03927 ftype = &p->frame;
03928 for (j=0 ; j<fs->size_y/4 ; j++)
03929 {
03930 jj = RSD(j);
03931 for (i=0 ; i<fs->size_x/4 ; i++)
03932 {
03933 ii = RSD(i);
03934
03935 ftype->mv[LIST_0][j][i][0]=fs->motion.mv[LIST_0][j][i][0];
03936 ftype->mv[LIST_0][j][i][1]=fs->motion.mv[LIST_0][j][i][1];
03937 ftype->mv[LIST_1][j][i][0]=fs->motion.mv[LIST_1][j][i][0];
03938 ftype->mv[LIST_1][j][i][1]=fs->motion.mv[LIST_1][j][i][1];
03939
03940 ftype->ref_idx[LIST_0][j][i]=fs->motion.ref_idx[LIST_0][j][i];
03941 ftype->ref_idx[LIST_1][j][i]=fs->motion.ref_idx[LIST_1][j][i];
03942 ftype->ref_pic_id[LIST_0][j][i] = fs->motion.ref_id[LIST_0][j][i];
03943 ftype->ref_pic_id[LIST_1][j][i] = fs->motion.ref_id[LIST_1][j][i];
03944
03945 if (img->direct_spatial_mv_pred_flag == 1)
03946 {
03947 ftype->moving_block[j][i]=
03948 !((!p->is_long_term
03949 && ((ftype->ref_idx[LIST_0][j][i] == 0)
03950 && (iabs(ftype->mv[LIST_0][j][i][0])>>1 == 0)
03951 && (iabs(ftype->mv[LIST_0][j][i][1])>>1 == 0)))
03952 || ((ftype->ref_idx[LIST_0][j][i] == -1)
03953 && (ftype->ref_idx[LIST_1][j][i] == 0)
03954 && (iabs(ftype->mv[LIST_1][j][i][0])>>1 == 0)
03955 && (iabs(ftype->mv[LIST_1][j][i][1])>>1 == 0)));
03956 }
03957 }
03958 }
03959 }
03960
03961
03962 if (img->direct_spatial_mv_pred_flag ==0)
03963 {
03964 ftype = &p->frame;
03965 for (j=0 ; j<fs->size_y/4 ; j++)
03966 {
03967 for (i=0 ; i<fs->size_x/4 ; i++)
03968 {
03969 if ((!img->MbaffFrameFlag &&!img->structure && fs->motion.field_frame[j][i]) || (img->MbaffFrameFlag && fs->motion.field_frame[j][i]))
03970 {
03971 ftype->mv[LIST_0][j][i][1] *= 2;
03972 ftype->mv[LIST_1][j][i][1] *= 2;
03973 }
03974 else if (img->structure && !fs->motion.field_frame[j][i])
03975 {
03976 ftype->mv[LIST_0][j][i][1] /= 2;
03977 ftype->mv[LIST_1][j][i][1] /= 2;
03978 }
03979
03980 }
03981 }
03982
03983 for (j=0; j<2 + (img->MbaffFrameFlag * 4);j+=2)
03984 {
03985 for (i=0; i<listXsize[j];i++)
03986 {
03987 int prescale, iTRb, iTRp;
03988
03989 if (j==0)
03990 {
03991 iTRb = iClip3( -128, 127, enc_picture->poc - listX[LIST_0 + j][i]->poc );
03992 }
03993 else if (j == 2)
03994 {
03995 iTRb = iClip3( -128, 127, enc_picture->top_poc - listX[LIST_0 + j][i]->poc );
03996 }
03997 else
03998 {
03999 iTRb = iClip3( -128, 127, enc_picture->bottom_poc - listX[LIST_0 + j][i]->poc );
04000 }
04001
04002 iTRp = iClip3( -128, 127, listX[LIST_1 + j][0]->poc - listX[LIST_0 + j][i]->poc);
04003
04004 if (iTRp!=0)
04005 {
04006 prescale = ( 16384 + iabs( iTRp / 2 ) ) / iTRp;
04007 img->mvscale[j][i] = iClip3( -1024, 1023, ( iTRb * prescale + 32 ) >> 6 ) ;
04008 }
04009 else
04010 {
04011 img->mvscale[j][i] = 9999;
04012 }
04013 }
04014 }
04015 }
04016 }
04017
04018
04019
04020
04021
04022
04023
04024
04025
04026
04027 void compute_colocated_JV(ColocatedParams* p, StorablePicture **listX[6])
04028 {
04029 StorablePicture *fs, *fs_top, *fs_bottom;
04030 MotionParams *ftype;
04031 int i,j, ii, jj, jdiv;
04032 int np = img->colour_plane_id;
04033
04034 fs_top = fs_bottom = fs = listX[LIST_1 ][0];
04035
04036 if (img->MbaffFrameFlag)
04037 {
04038 fs_top= listX[LIST_1 + 2][0];
04039 fs_bottom= listX[LIST_1 + 4][0];
04040 }
04041 else
04042 {
04043 if (img->structure!=FRAME)
04044 {
04045 if ((img->structure != fs->structure) && (fs->coded_frame))
04046 {
04047 if (img->structure==TOP_FIELD)
04048 {
04049 fs_top = fs_bottom = fs = listX[LIST_1 ][0]->top_field;
04050 }
04051 else
04052 {
04053 fs_top = fs_bottom = fs = listX[LIST_1 ][0]->bottom_field;
04054 }
04055 }
04056 }
04057 }
04058
04059 if (!active_sps->frame_mbs_only_flag || active_sps->direct_8x8_inference_flag)
04060 {
04061 ftype = &p->frame;
04062 for (j=0 ; j<fs->size_y/4 ; j++)
04063 {
04064 jdiv = j/2;
04065 jj = j/2 + 4 * (j/8);
04066 for (i=0 ; i<fs->size_x/4 ; i++)
04067 {
04068
04069 if (img->MbaffFrameFlag && fs->motion.field_frame[j][i])
04070 {
04071
04072
04073
04074
04075 if (iabs(enc_picture->poc - fs_bottom->poc) > iabs(enc_picture->poc - fs_top->poc) )
04076 {
04077 ftype->mv[LIST_0][j][i][0] = fs_top->JVmotion[np].mv[LIST_0][jdiv][i][0];
04078 ftype->mv[LIST_0][j][i][1] = fs_top->JVmotion[np].mv[LIST_0][jdiv][i][1] ;
04079 ftype->mv[LIST_1][j][i][0] = fs_top->JVmotion[np].mv[LIST_1][jdiv][i][0];
04080 ftype->mv[LIST_1][j][i][1] = fs_top->JVmotion[np].mv[LIST_1][jdiv][i][1] ;
04081 ftype->ref_idx[LIST_0][j][i] = fs_top->JVmotion[np].ref_idx[LIST_0][jdiv][i];
04082 ftype->ref_idx[LIST_1][j][i] = fs_top->JVmotion[np].ref_idx[LIST_1][jdiv][i];
04083 ftype->ref_pic_id[LIST_0][j][i] = fs->JVmotion[np].ref_id[LIST_0][jj][i];
04084 ftype->ref_pic_id[LIST_1][j][i] = fs->JVmotion[np].ref_id[LIST_1][jj][i];
04085
04086 p->is_long_term = fs_top->is_long_term;
04087 }
04088 else
04089 {
04090 ftype->mv[LIST_0][j][i][0] = fs_bottom->JVmotion[np].mv[LIST_0][jdiv][i][0];
04091 ftype->mv[LIST_0][j][i][1] = fs_bottom->JVmotion[np].mv[LIST_0][jdiv][i][1] ;
04092 ftype->mv[LIST_1][j][i][0] = fs_bottom->JVmotion[np].mv[LIST_1][jdiv][i][0];
04093 ftype->mv[LIST_1][j][i][1] = fs_bottom->JVmotion[np].mv[LIST_1][jdiv][i][1] ;
04094 ftype->ref_idx[LIST_0][j][i] = fs_bottom->JVmotion[np].ref_idx[LIST_0][jdiv][i];
04095 ftype->ref_idx[LIST_1][j][i] = fs_bottom->JVmotion[np].ref_idx[LIST_1][jdiv][i];
04096 ftype->ref_pic_id[LIST_0][j][i] = fs->JVmotion[np].ref_id[LIST_0][jj + 4][i];
04097 ftype->ref_pic_id[LIST_1][j][i] = fs->JVmotion[np].ref_id[LIST_1][jj + 4][i];
04098
04099 p->is_long_term = fs_bottom->is_long_term;
04100 }
04101 }
04102 else
04103 {
04104 ftype->mv[LIST_0][j][i][0] = fs->JVmotion[np].mv[LIST_0][j][i][0];
04105 ftype->mv[LIST_0][j][i][1] = fs->JVmotion[np].mv[LIST_0][j][i][1] ;
04106 ftype->mv[LIST_1][j][i][0] = fs->JVmotion[np].mv[LIST_1][j][i][0];
04107 ftype->mv[LIST_1][j][i][1] = fs->JVmotion[np].mv[LIST_1][j][i][1] ;
04108 ftype->ref_idx[LIST_0][j][i] = fs->JVmotion[np].ref_idx[LIST_0][j][i];
04109 ftype->ref_idx[LIST_1][j][i] = fs->JVmotion[np].ref_idx[LIST_1][j][i];
04110 ftype->ref_pic_id[LIST_0][j][i] = fs->JVmotion[np].ref_id[LIST_0][j][i];
04111 ftype->ref_pic_id[LIST_1][j][i] = fs->JVmotion[np].ref_id[LIST_1][j][i];
04112
04113 p->is_long_term = fs->is_long_term;
04114 }
04115 }
04116 }
04117 }
04118
04119
04120
04121 if (img->structure || img->MbaffFrameFlag)
04122 {
04123 ftype = &p->frame;
04124 for (j=0 ; j<fs->size_y/8 ; j++)
04125 {
04126 jj = RSD(j);
04127 for (i=0 ; i<fs->size_x/4 ; i++)
04128 {
04129 ii = RSD(i);
04130
04131 if (!img->MbaffFrameFlag )
04132 {
04133 ftype->mv[LIST_0][j][i][0] = fs->JVmotion[np].mv[LIST_0][jj][ii][0];
04134 ftype->mv[LIST_0][j][i][1] = fs->JVmotion[np].mv[LIST_0][jj][ii][1];
04135 ftype->mv[LIST_1][j][i][0] = fs->JVmotion[np].mv[LIST_1][jj][ii][0];
04136 ftype->mv[LIST_1][j][i][1] = fs->JVmotion[np].mv[LIST_1][jj][ii][1];
04137
04138
04139
04140 if (fs->motion.ref_idx[LIST_0][jj][ii] == -1)
04141 {
04142 ftype->ref_idx [LIST_0][j][i] = -1;
04143 ftype->ref_pic_id[LIST_0][j][i] = -1;
04144 }
04145 else
04146 {
04147 ftype->ref_idx [LIST_0][j][i] = fs->JVmotion[np].ref_idx[LIST_0][jj][ii] ;
04148 ftype->ref_pic_id[LIST_0][j][i] = fs->JVmotion[np].ref_id[LIST_0][jj][ii];
04149 }
04150
04151 if (fs->motion.ref_idx[LIST_1][jj][ii] == -1)
04152 {
04153 ftype->ref_idx [LIST_1][j][i] = -1;
04154 ftype->ref_pic_id[LIST_1][j][i] = -1;
04155 }
04156 else
04157 {
04158 ftype->ref_idx [LIST_1][j][i] = fs->JVmotion[np].ref_idx[LIST_1][jj][ii];
04159 ftype->ref_pic_id[LIST_1][j][i] = fs->JVmotion[np].ref_id[LIST_1][jj][ii];
04160 }
04161
04162 p->is_long_term = fs->is_long_term;
04163
04164 if (img->direct_spatial_mv_pred_flag == 1)
04165 {
04166 ftype->moving_block[j][i] =
04167 !((!p->is_long_term
04168 && ((ftype->ref_idx[LIST_0][j][i] == 0)
04169 && (iabs(ftype->mv[LIST_0][j][i][0])>>1 == 0)
04170 && (iabs(ftype->mv[LIST_0][j][i][1])>>1 == 0)))
04171 || ((ftype->ref_idx[LIST_0][j][i] == -1)
04172 && (ftype->ref_idx[LIST_1][j][i] == 0)
04173 && (iabs(ftype->mv[LIST_1][j][i][0])>>1 == 0)
04174 && (iabs(ftype->mv[LIST_1][j][i][1])>>1 == 0)));
04175 }
04176 }
04177 else
04178 {
04179 p->bottom.mv[LIST_0][j][i][0] = fs_bottom->JVmotion[np].mv[LIST_0][jj][ii][0];
04180 p->bottom.mv[LIST_0][j][i][1] = fs_bottom->JVmotion[np].mv[LIST_0][jj][ii][1];
04181 p->bottom.mv[LIST_1][j][i][0] = fs_bottom->JVmotion[np].mv[LIST_1][jj][ii][0];
04182 p->bottom.mv[LIST_1][j][i][1] = fs_bottom->JVmotion[np].mv[LIST_1][jj][ii][1];
04183 p->bottom.ref_idx[LIST_0][j][i] = fs_bottom->JVmotion[np].ref_idx[LIST_0][jj][ii];
04184 p->bottom.ref_idx[LIST_1][j][i] = fs_bottom->JVmotion[np].ref_idx[LIST_1][jj][ii];
04185 p->bottom.ref_pic_id[LIST_0][j][i] = fs_bottom->JVmotion[np].ref_id[LIST_0][jj][ii];
04186 p->bottom.ref_pic_id[LIST_1][j][i] = fs_bottom->JVmotion[np].ref_id[LIST_1][jj][ii];
04187
04188 if (img->direct_spatial_mv_pred_flag == 1)
04189 {
04190 p->bottom.moving_block[j][i] =
04191 !((!fs_bottom->is_long_term
04192 && ((p->bottom.ref_idx[LIST_0][j][i] == 0)
04193 && (iabs(p->bottom.mv[LIST_0][j][i][0])>>1 == 0)
04194 && (iabs(p->bottom.mv[LIST_0][j][i][1])>>1 == 0)))
04195 || ((p->bottom.ref_idx[LIST_0][j][i] == -1)
04196 && (p->bottom.ref_idx[LIST_1][j][i] == 0)
04197 && (iabs(p->bottom.mv[LIST_1][j][i][0])>>1 == 0)
04198 && (iabs(p->bottom.mv[LIST_1][j][i][1])>>1 == 0)));
04199 }
04200
04201 p->top.mv[LIST_0][j][i][0] = fs_top->JVmotion[np].mv[LIST_0][jj][ii][0];
04202 p->top.mv[LIST_0][j][i][1] = fs_top->JVmotion[np].mv[LIST_0][jj][ii][1];
04203 p->top.mv[LIST_1][j][i][0] = fs_top->JVmotion[np].mv[LIST_1][jj][ii][0];
04204 p->top.mv[LIST_1][j][i][1] = fs_top->JVmotion[np].mv[LIST_1][jj][ii][1];
04205 p->top.ref_idx[LIST_0][j][i] = fs_top->JVmotion[np].ref_idx[LIST_0][jj][ii];
04206 p->top.ref_idx[LIST_1][j][i] = fs_top->JVmotion[np].ref_idx[LIST_1][jj][ii];
04207 p->top.ref_pic_id[LIST_0][j][i] = fs_top->JVmotion[np].ref_id[LIST_0][jj][ii];
04208 p->top.ref_pic_id[LIST_1][j][i] = fs_top->JVmotion[np].ref_id[LIST_1][jj][ii];
04209
04210 if (img->direct_spatial_mv_pred_flag == 1)
04211 {
04212 p->top.moving_block[j][i] =
04213 !((!fs_top->is_long_term
04214 && ((p->top.ref_idx[LIST_0][j][i] == 0)
04215 && (iabs(p->top.mv[LIST_0][j][i][0])>>1 == 0)
04216 && (iabs(p->top.mv[LIST_0][j][i][1])>>1 == 0)))
04217 || ((p->top.ref_idx[LIST_0][j][i] == -1)
04218 && (p->top.ref_idx[LIST_1][j][i] == 0)
04219 && (iabs(p->top.mv[LIST_1][j][i][0])>>1 == 0)
04220 && (iabs(p->top.mv[LIST_1][j][i][1])>>1 == 0)));
04221 }
04222
04223 if ((img->direct_spatial_mv_pred_flag == 0 ) && !fs->motion.field_frame[2*j][i])
04224 {
04225 p->top.mv[LIST_0][j][i][1] /= 2;
04226 p->top.mv[LIST_1][j][i][1] /= 2;
04227 p->bottom.mv[LIST_0][j][i][1] /= 2;
04228 p->bottom.mv[LIST_1][j][i][1] /= 2;
04229 }
04230
04231 }
04232 }
04233 }
04234 }
04235
04236
04237 if (!active_sps->frame_mbs_only_flag || active_sps->direct_8x8_inference_flag)
04238 {
04239
04240
04241
04242 if (!img->structure)
04243 {
04244 ftype = &p->frame;
04245 for (j=0 ; j < (fs->size_y>>2) ; j++)
04246 {
04247 jdiv = j>>1;
04248 jj = (j>>1) + 4*(j>>3);
04249 for (i=0 ; i < (fs->size_x>>2) ; i++)
04250 {
04251
04252 if (fs->motion.field_frame[j][i])
04253 {
04254 if (iabs(enc_picture->poc - fs->bottom_field->poc) > iabs(enc_picture->poc - fs->top_field->poc))
04255 {
04256 ftype->mv[LIST_0][j][i][0] = fs->top_field->JVmotion[np].mv[LIST_0][jdiv][i][0];
04257 ftype->mv[LIST_0][j][i][1] = fs->top_field->JVmotion[np].mv[LIST_0][jdiv][i][1] ;
04258 ftype->mv[LIST_1][j][i][0] = fs->top_field->JVmotion[np].mv[LIST_1][jdiv][i][0];
04259 ftype->mv[LIST_1][j][i][1] = fs->top_field->JVmotion[np].mv[LIST_1][jdiv][i][1] ;
04260
04261 ftype->ref_idx[LIST_0][j][i] = fs->top_field->JVmotion[np].ref_idx[LIST_0][jdiv][i];
04262 ftype->ref_idx[LIST_1][j][i] = fs->top_field->JVmotion[np].ref_idx[LIST_1][jdiv][i];
04263 ftype->ref_pic_id[LIST_0][j][i] = fs->JVmotion[np].ref_id[LIST_0][jj][i];
04264 ftype->ref_pic_id[LIST_1][j][i] = fs->JVmotion[np].ref_id[LIST_1][jj][i];
04265 p->is_long_term = fs->top_field->is_long_term;
04266 }
04267 else
04268 {
04269 ftype->mv[LIST_0][j][i][0] = fs->bottom_field->JVmotion[np].mv[LIST_0][jdiv][i][0];
04270 ftype->mv[LIST_0][j][i][1] = fs->bottom_field->JVmotion[np].mv[LIST_0][jdiv][i][1] ;
04271 ftype->mv[LIST_1][j][i][0] = fs->bottom_field->JVmotion[np].mv[LIST_1][jdiv][i][0];
04272 ftype->mv[LIST_1][j][i][1] = fs->bottom_field->JVmotion[np].mv[LIST_1][jdiv][i][1] ;
04273
04274 ftype->ref_idx[LIST_0][j][i] = fs->bottom_field->JVmotion[np].ref_idx[LIST_0][jdiv][i];
04275 ftype->ref_idx[LIST_1][j][i] = fs->bottom_field->JVmotion[np].ref_idx[LIST_1][jdiv][i];
04276 ftype->ref_pic_id[LIST_0][j][i] = fs->JVmotion[np].ref_id[LIST_0][jj + 4][i];
04277 ftype->ref_pic_id[LIST_1][j][i] = fs->JVmotion[np].ref_id[LIST_1][jj + 4][i];
04278 p->is_long_term = fs->bottom_field->is_long_term;
04279 }
04280 }
04281 }
04282 }
04283 }
04284 }
04285
04286
04287 p->is_long_term = fs->is_long_term;
04288
04289 if (!active_sps->frame_mbs_only_flag || active_sps->direct_8x8_inference_flag)
04290 {
04291 ftype = &p->frame;
04292 for (j=0 ; j < (fs->size_y>>2) ; j++)
04293 {
04294 jj = RSD(j);
04295 for (i=0 ; i < (fs->size_x>>2) ; i++)
04296 {
04297 ii = RSD(i);
04298
04299 ftype->mv[LIST_0][j][i][0]=ftype->mv[LIST_0][jj][ii][0];
04300 ftype->mv[LIST_0][j][i][1]=ftype->mv[LIST_0][jj][ii][1];
04301 ftype->mv[LIST_1][j][i][0]=ftype->mv[LIST_1][jj][ii][0];
04302 ftype->mv[LIST_1][j][i][1]=ftype->mv[LIST_1][jj][ii][1];
04303
04304 ftype->ref_idx[LIST_0][j][i]=ftype->ref_idx[LIST_0][jj][ii];
04305 ftype->ref_idx[LIST_1][j][i]=ftype->ref_idx[LIST_1][jj][ii];
04306 ftype->ref_pic_id[LIST_0][j][i] = ftype->ref_pic_id[LIST_0][jj][ii];
04307 ftype->ref_pic_id[LIST_1][j][i] = ftype->ref_pic_id[LIST_1][jj][ii];
04308
04309 if (img->direct_spatial_mv_pred_flag == 1)
04310 {
04311 ftype->moving_block[j][i]=
04312 !((!p->is_long_term
04313 && ((ftype->ref_idx[LIST_0][j][i] == 0)
04314 && (iabs(ftype->mv[LIST_0][j][i][0])>>1 == 0)
04315 && (iabs(ftype->mv[LIST_0][j][i][1])>>1 == 0)))
04316 || ((ftype->ref_idx[LIST_0][j][i] == -1)
04317 && (ftype->ref_idx[LIST_1][j][i] == 0)
04318 && (iabs(ftype->mv[LIST_1][j][i][0])>>1 == 0)
04319 && (iabs(ftype->mv[LIST_1][j][i][1])>>1 == 0)));
04320 }
04321 }
04322 }
04323 }
04324 else
04325 {
04326 ftype = &p->frame;
04327 for (j=0 ; j<fs->size_y/4 ; j++)
04328 {
04329 jj = RSD(j);
04330 for (i=0 ; i<fs->size_x/4 ; i++)
04331 {
04332 ii = RSD(i);
04333
04334 ftype->mv[LIST_0][j][i][0]=fs->JVmotion[np].mv[LIST_0][j][i][0];
04335 ftype->mv[LIST_0][j][i][1]=fs->JVmotion[np].mv[LIST_0][j][i][1];
04336 ftype->mv[LIST_1][j][i][0]=fs->JVmotion[np].mv[LIST_1][j][i][0];
04337 ftype->mv[LIST_1][j][i][1]=fs->JVmotion[np].mv[LIST_1][j][i][1];
04338
04339 ftype->ref_idx[LIST_0][j][i]=fs->JVmotion[np].ref_idx[LIST_0][j][i];
04340 ftype->ref_idx[LIST_1][j][i]=fs->JVmotion[np].ref_idx[LIST_1][j][i];
04341 ftype->ref_pic_id[LIST_0][j][i] = fs->JVmotion[np].ref_id[LIST_0][j][i];
04342 ftype->ref_pic_id[LIST_1][j][i] = fs->JVmotion[np].ref_id[LIST_1][j][i];
04343
04344 if (img->direct_spatial_mv_pred_flag == 1)
04345 {
04346 ftype->moving_block[j][i]=
04347 !((!p->is_long_term
04348 && ((ftype->ref_idx[LIST_0][j][i] == 0)
04349 && (iabs(ftype->mv[LIST_0][j][i][0])>>1 == 0)
04350 && (iabs(ftype->mv[LIST_0][j][i][1])>>1 == 0)))
04351 || ((ftype->ref_idx[LIST_0][j][i] == -1)
04352 && (ftype->ref_idx[LIST_1][j][i] == 0)
04353 && (iabs(ftype->mv[LIST_1][j][i][0])>>1 == 0)
04354 && (iabs(ftype->mv[LIST_1][j][i][1])>>1 == 0)));
04355 }
04356 }
04357 }
04358 }
04359
04360
04361 if (img->direct_spatial_mv_pred_flag ==0)
04362 {
04363 ftype = &p->frame;
04364 for (j=0 ; j<fs->size_y/4 ; j++)
04365 {
04366 for (i=0 ; i<fs->size_x/4 ; i++)
04367 {
04368 if ((!img->MbaffFrameFlag &&!img->structure && fs->motion.field_frame[j][i]) || (img->MbaffFrameFlag && fs->motion.field_frame[j][i]))
04369 {
04370 ftype->mv[LIST_0][j][i][1] *= 2;
04371 ftype->mv[LIST_1][j][i][1] *= 2;
04372 }
04373 else if (img->structure && !fs->motion.field_frame[j][i])
04374 {
04375 ftype->mv[LIST_0][j][i][1] /= 2;
04376 ftype->mv[LIST_1][j][i][1] /= 2;
04377 }
04378
04379 }
04380 }
04381
04382 for (j=0; j<2 + (img->MbaffFrameFlag * 4);j+=2)
04383 {
04384 for (i=0; i<listXsize[j];i++)
04385 {
04386 int prescale, iTRb, iTRp;
04387
04388 if (j==0)
04389 {
04390 iTRb = iClip3( -128, 127, enc_picture->poc - listX[LIST_0 + j][i]->poc );
04391 }
04392 else if (j == 2)
04393 {
04394 iTRb = iClip3( -128, 127, enc_picture->top_poc - listX[LIST_0 + j][i]->poc );
04395 }
04396 else
04397 {
04398 iTRb = iClip3( -128, 127, enc_picture->bottom_poc - listX[LIST_0 + j][i]->poc );
04399 }
04400
04401 iTRp = iClip3( -128, 127, listX[LIST_1 + j][0]->poc - listX[LIST_0 + j][i]->poc);
04402
04403 if (iTRp!=0)
04404 {
04405 prescale = ( 16384 + iabs( iTRp / 2 ) ) / iTRp;
04406 img->mvscale[j][i] = iClip3( -1024, 1023, ( iTRb * prescale + 32 ) >> 6 ) ;
04407 }
04408 else
04409 {
04410 img->mvscale[j][i] = 9999;
04411 }
04412 }
04413 }
04414 }
04415 }
04416
04417
04418
04419
04420
04421
04422
04423
04424
04425 void copy_storable_param_JV( int nplane, StorablePicture *d, StorablePicture *s )
04426 {
04427 int md_size = (img->height / BLOCK_SIZE) * (img->width / BLOCK_SIZE);
04428 int ref_size = active_sps->frame_mbs_only_flag ? 2 * md_size : 6 * md_size;
04429
04430
04431 memcpy( d->JVmotion[nplane].ref_idx[0][0], s->motion.ref_idx[0][0], 2 * md_size * sizeof(byte) );
04432
04433
04434 memcpy( d->JVmotion[nplane].ref_pic_id[0][0], s->motion.ref_pic_id[0][0], ref_size * sizeof(int64) );
04435
04436
04437 memcpy( d->JVmotion[nplane].ref_id[0][0], s->motion.ref_id[0][0], ref_size * sizeof(int64));
04438
04439
04440 memcpy( d->JVmotion[nplane].mv[0][0][0], s->motion.mv[0][0][0], 2 * md_size * 2 * sizeof(short) );
04441 }