1609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* ------------------------------------------------------------------ 2609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * 4609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * you may not use this file except in compliance with the License. 6609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * You may obtain a copy of the License at 7609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * 8609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * 10609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Unless required by applicable law or agreed to in writing, software 11609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * express or implied. 14609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * See the License for the specific language governing permissions 15609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * and limitations under the License. 16609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * ------------------------------------------------------------------- 17609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber */ 18609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#include "avclib_common.h" 19609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 20609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/** see subclause 8.2.4 Decoding process for reference picture lists construction. */ 21609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF void RefListInit(AVCCommonObj *video) 22609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 23609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCSliceHeader *sliceHdr = video->sliceHdr; 24609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCDecPicBuffer *dpb = video->decPicBuf; 25609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int slice_type = video->slice_type; 26609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, list0idx; 27609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 28609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData *tmp_s; 29609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 30609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber list0idx = 0; 31609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 32609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (slice_type == AVC_I_SLICE) 33609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 34609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->refList0Size = 0; 35609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->refList1Size = 0; 36609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 37609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* we still have to calculate FrameNumWrap to make sure that all I-slice clip 38609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber can perform sliding_window_operation properly. */ 39609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 40609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < dpb->num_fs; i++) 41609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 42609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((dpb->fs[i]->IsReference == 3) && (!dpb->fs[i]->IsLongTerm)) 43609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 44609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* subclause 8.2.4.1 Decoding process for picture numbers. */ 45609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (dpb->fs[i]->FrameNum > (int)sliceHdr->frame_num) 46609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 47609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[i]->FrameNumWrap = dpb->fs[i]->FrameNum - video->MaxFrameNum; 48609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 49609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 50609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 51609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[i]->FrameNumWrap = dpb->fs[i]->FrameNum; 52609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 53609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[i]->frame.PicNum = dpb->fs[i]->FrameNumWrap; 54609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 55609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 56609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 57609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 58609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 59609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 60609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (slice_type == AVC_P_SLICE) 61609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 62609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* Calculate FrameNumWrap and PicNum */ 63609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 64609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < dpb->num_fs; i++) 65609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 66609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((dpb->fs[i]->IsReference == 3) && (!dpb->fs[i]->IsLongTerm)) 67609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 68609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* subclause 8.2.4.1 Decoding process for picture numbers. */ 69609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (dpb->fs[i]->FrameNum > (int)sliceHdr->frame_num) 70609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 71609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[i]->FrameNumWrap = dpb->fs[i]->FrameNum - video->MaxFrameNum; 72609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 73609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 74609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 75609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[i]->FrameNumWrap = dpb->fs[i]->FrameNum; 76609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 77609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[i]->frame.PicNum = dpb->fs[i]->FrameNumWrap; 78609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->RefPicList0[list0idx++] = &(dpb->fs[i]->frame); 79609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 80609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 81609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 82609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (list0idx == 0) 83609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 84609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[0]->IsReference = 3; 85609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->RefPicList0[0] = &(dpb->fs[0]->frame); 86609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber list0idx = 1; 87609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 88609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* order list 0 by PicNum from max to min, see subclause 8.2.4.2.1 */ 89609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber SortPicByPicNum(video->RefPicList0, list0idx); 90609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->refList0Size = list0idx; 91609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 92609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* long term handling */ 93609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < dpb->num_fs; i++) 94609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 95609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (dpb->fs[i]->IsLongTerm == 3) 96609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 97609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* subclause 8.2.4.1 Decoding process for picture numbers. */ 98609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber dpb->fs[i]->frame.LongTermPicNum = dpb->fs[i]->LongTermFrameIdx; 99609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->RefPicList0[list0idx++] = &(dpb->fs[i]->frame); 100609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 101609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 102609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 103609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* order PicNum from min to max, see subclause 8.2.4.2.1 */ 104609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber SortPicByPicNumLongTerm(&(video->RefPicList0[video->refList0Size]), list0idx - video->refList0Size); 105609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->refList0Size = list0idx; 106609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 107609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 108609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->refList1Size = 0; 109609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 110609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 111609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 112609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((video->refList0Size == video->refList1Size) && (video->refList0Size > 1)) 113609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 114609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* check if lists are identical, if yes swap first two elements of listX[1] */ 115609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* last paragraph of subclause 8.2.4.2.4 */ 116609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 117609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < video->refList0Size; i++) 118609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 119609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->RefPicList0[i] != video->RefPicList1[i]) 120609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 121609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber break; 122609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 123609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 124609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (i == video->refList0Size) 125609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 126609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tmp_s = video->RefPicList1[0]; 127609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->RefPicList1[0] = video->RefPicList1[1]; 128609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->RefPicList1[1] = tmp_s; 129609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 130609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 131609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 132609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* set max size */ 133609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->refList0Size = AVC_MIN(video->refList0Size, (int)video->sliceHdr->num_ref_idx_l0_active_minus1 + 1); 134609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->refList1Size = AVC_MIN(video->refList1Size, (int)video->sliceHdr->num_ref_idx_l1_active_minus1 + 1); 135609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 136609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 137609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 138609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.4.3 */ 139609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF AVCStatus ReOrderList(AVCCommonObj *video) 140609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 141609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCSliceHeader *sliceHdr = video->sliceHdr; 142609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCStatus status = AVC_SUCCESS; 143609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int slice_type = video->slice_type; 144609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 145609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (slice_type != AVC_I_SLICE) 146609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 147609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (sliceHdr->ref_pic_list_reordering_flag_l0) 148609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 149609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber status = ReorderRefPicList(video, 0); 150609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (status != AVC_SUCCESS) 151609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return status; 152609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 153609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->refList0Size == 0) 154609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 155609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_FAIL; 156609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 157609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 158609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return status; 159609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 160609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 161609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberAVCStatus ReorderRefPicList(AVCCommonObj *video, int isL1) 162609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 163609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCSliceHeader *sliceHdr = video->sliceHdr; 164609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCStatus status; 165609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 166609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int *list_size; 167609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int num_ref_idx_lX_active_minus1; 168609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber uint *remapping_of_pic_nums_idc; 169609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int *abs_diff_pic_num_minus1; 170609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int *long_term_pic_idx; 171609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i; 172609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int maxPicNum, currPicNum, picNumLXNoWrap, picNumLXPred, picNumLX; 173609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int refIdxLX = 0; 174609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber void* tmp; 175609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 176609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (!isL1) /* list 0 */ 177609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 178609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber list_size = &(video->refList0Size); 179609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber num_ref_idx_lX_active_minus1 = sliceHdr->num_ref_idx_l0_active_minus1; 180609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber remapping_of_pic_nums_idc = sliceHdr->reordering_of_pic_nums_idc_l0; 181609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tmp = (void*)sliceHdr->abs_diff_pic_num_minus1_l0; 182609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber abs_diff_pic_num_minus1 = (int*) tmp; 183609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tmp = (void*)sliceHdr->long_term_pic_num_l0; 184609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber long_term_pic_idx = (int*) tmp; 185609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 186609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 187609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 188609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber list_size = &(video->refList1Size); 189609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber num_ref_idx_lX_active_minus1 = sliceHdr->num_ref_idx_l1_active_minus1; 190609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber remapping_of_pic_nums_idc = sliceHdr->reordering_of_pic_nums_idc_l1; 191609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tmp = (void*) sliceHdr->abs_diff_pic_num_minus1_l1; 192609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber abs_diff_pic_num_minus1 = (int*) tmp; 193609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tmp = (void*) sliceHdr->long_term_pic_num_l1; 194609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber long_term_pic_idx = (int*)tmp; 195609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 196609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 197609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber maxPicNum = video->MaxPicNum; 198609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber currPicNum = video->CurrPicNum; 199609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 200609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLXPred = currPicNum; /* initial value */ 201609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 202609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; remapping_of_pic_nums_idc[i] != 3; i++) 203609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 204609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((remapping_of_pic_nums_idc[i] > 3) || (i >= MAX_REF_PIC_LIST_REORDERING)) 205609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 206609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_FAIL; /* out of range */ 207609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 208609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* see subclause 8.2.4.3.1 */ 209609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (remapping_of_pic_nums_idc[i] < 2) 210609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 211609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (remapping_of_pic_nums_idc[i] == 0) 212609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 213609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (picNumLXPred - (abs_diff_pic_num_minus1[i] + 1) < 0) 214609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLXNoWrap = picNumLXPred - (abs_diff_pic_num_minus1[i] + 1) + maxPicNum; 215609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 216609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLXNoWrap = picNumLXPred - (abs_diff_pic_num_minus1[i] + 1); 217609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 218609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else /* (remapping_of_pic_nums_idc[i] == 1) */ 219609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 220609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (picNumLXPred + (abs_diff_pic_num_minus1[i] + 1) >= maxPicNum) 221609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLXNoWrap = picNumLXPred + (abs_diff_pic_num_minus1[i] + 1) - maxPicNum; 222609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 223609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLXNoWrap = picNumLXPred + (abs_diff_pic_num_minus1[i] + 1); 224609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 225609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLXPred = picNumLXNoWrap; /* prediction for the next one */ 226609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 227609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (picNumLXNoWrap > currPicNum) 228609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLX = picNumLXNoWrap - maxPicNum; 229609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 230609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picNumLX = picNumLXNoWrap; 231609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 232609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber status = ReorderShortTerm(video, picNumLX, &refIdxLX, isL1); 233609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (status != AVC_SUCCESS) 234609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 235609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return status; 236609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 237609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 238609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else /* (remapping_of_pic_nums_idc[i] == 2), subclause 8.2.4.3.2 */ 239609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 240609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber status = ReorderLongTerm(video, long_term_pic_idx[i], &refIdxLX, isL1); 241609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (status != AVC_SUCCESS) 242609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 243609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return status; 244609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 245609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 246609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 247609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* that's a definition */ 248609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *list_size = num_ref_idx_lX_active_minus1 + 1; 249609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 250609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_SUCCESS; 251609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 252609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 253609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.4.3.1 */ 254609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberAVCStatus ReorderShortTerm(AVCCommonObj *video, int picNumLX, int *refIdxLX, int isL1) 255609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 256609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int cIdx, nIdx; 257609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int num_ref_idx_lX_active_minus1; 258609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData *picLX, **RefPicListX; 259609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 260609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (!isL1) /* list 0 */ 261609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 262609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX = video->RefPicList0; 263609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber num_ref_idx_lX_active_minus1 = video->sliceHdr->num_ref_idx_l0_active_minus1; 264609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 265609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 266609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 267609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX = video->RefPicList1; 268609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber num_ref_idx_lX_active_minus1 = video->sliceHdr->num_ref_idx_l1_active_minus1; 269609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 270609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 271609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picLX = GetShortTermPic(video, picNumLX); 272609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 273609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (picLX == NULL) 274609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 275609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_FAIL; 276609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 277609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* Note RefPicListX has to access element number num_ref_idx_lX_active */ 278609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* There could be access violation here. */ 279609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (num_ref_idx_lX_active_minus1 + 1 >= MAX_REF_PIC_LIST) 280609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 281609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_FAIL; 282609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 283609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 284609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (cIdx = num_ref_idx_lX_active_minus1 + 1; cIdx > *refIdxLX; cIdx--) 285609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 286609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1]; 287609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 288609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 289609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX[(*refIdxLX)++ ] = picLX; 290609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 291609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber nIdx = *refIdxLX; 292609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 293609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1 + 1; cIdx++) 294609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 295609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (RefPicListX[ cIdx ]) 296609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 297609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((RefPicListX[ cIdx ]->isLongTerm) || ((int)RefPicListX[ cIdx ]->PicNum != picNumLX)) 298609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 299609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ]; 300609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 301609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 302609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 303609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_SUCCESS; 304609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 305609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 306609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.4.3.2 */ 307609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberAVCStatus ReorderLongTerm(AVCCommonObj *video, int LongTermPicNum, int *refIdxLX, int isL1) 308609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 309609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData **RefPicListX; 310609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int num_ref_idx_lX_active_minus1; 311609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int cIdx, nIdx; 312609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData *picLX; 313609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 314609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (!isL1) /* list 0 */ 315609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 316609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX = video->RefPicList0; 317609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber num_ref_idx_lX_active_minus1 = video->sliceHdr->num_ref_idx_l0_active_minus1; 318609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 319609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 320609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 321609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX = video->RefPicList1; 322609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber num_ref_idx_lX_active_minus1 = video->sliceHdr->num_ref_idx_l1_active_minus1; 323609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 324609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 325609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber picLX = GetLongTermPic(video, LongTermPicNum); 326609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (picLX == NULL) 327609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 328609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_FAIL; 329609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 330609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* Note RefPicListX has to access element number num_ref_idx_lX_active */ 331609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* There could be access violation here. */ 332609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (num_ref_idx_lX_active_minus1 + 1 >= MAX_REF_PIC_LIST) 333609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 334609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_FAIL; 335609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 336609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (cIdx = num_ref_idx_lX_active_minus1 + 1; cIdx > *refIdxLX; cIdx--) 337609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1]; 338609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 339609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX[(*refIdxLX)++ ] = picLX; 340609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 341609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber nIdx = *refIdxLX; 342609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 343609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1 + 1; cIdx++) 344609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 345609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((!RefPicListX[ cIdx ]->isLongTerm) || ((int)RefPicListX[ cIdx ]->LongTermPicNum != LongTermPicNum)) 346609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 347609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ]; 348609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 349609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 350609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return AVC_SUCCESS; 351609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 352609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 353609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 354609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberAVCPictureData* GetShortTermPic(AVCCommonObj *video, int picNum) 355609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 356609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i; 357609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCDecPicBuffer *dpb = video->decPicBuf; 358609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 359609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < dpb->num_fs; i++) 360609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 361609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 362609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (dpb->fs[i]->IsReference == 3) 363609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 364609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((dpb->fs[i]->frame.isLongTerm == FALSE) && (dpb->fs[i]->frame.PicNum == picNum)) 365609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 366609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return &(dpb->fs[i]->frame); 367609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 368609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 369609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 370609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 371609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 372609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return NULL; 373609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 374609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 375609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberAVCPictureData* GetLongTermPic(AVCCommonObj *video, int LongtermPicNum) 376609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 377609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCDecPicBuffer *dpb = video->decPicBuf; 378609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i; 379609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 380609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < dpb->num_fs; i++) 381609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 382609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 383609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (dpb->fs[i]->IsReference == 3) 384609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 385609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((dpb->fs[i]->frame.isLongTerm == TRUE) && (dpb->fs[i]->frame.LongTermPicNum == LongtermPicNum)) 386609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 387609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return &(dpb->fs[i]->frame); 388609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 389609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 390609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 391609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 392609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return NULL; 393609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 394609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 395609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberint is_short_ref(AVCPictureData *s) 396609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 397609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ((s->isReference) && !(s->isLongTerm)); 398609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 399609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 400609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberint is_long_ref(AVCPictureData *s) 401609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 402609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ((s->isReference) && (s->isLongTerm)); 403609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 404609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 405609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 406609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* sort by PicNum, descending order */ 407609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid SortPicByPicNum(AVCPictureData *data[], int num) 408609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 409609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j; 410609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData *temp; 411609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 412609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 413609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 414609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 415609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 416609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->PicNum > data[i]->PicNum) 417609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 418609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 419609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 420609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 421609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 422609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 423609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 424609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 425609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 426609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 427609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 428609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* sort by PicNum, ascending order */ 429609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid SortPicByPicNumLongTerm(AVCPictureData *data[], int num) 430609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 431609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j; 432609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData *temp; 433609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 434609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 435609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 436609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 437609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 438609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->LongTermPicNum < data[i]->LongTermPicNum) 439609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 440609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 441609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 442609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 443609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 444609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 445609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 446609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 447609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 448609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 449609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 450609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 451609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* sort by FrameNumWrap, descending order */ 452609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid SortFrameByFrameNumWrap(AVCFrameStore *data[], int num) 453609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 454609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j; 455609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCFrameStore *temp; 456609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 457609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 458609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 459609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 460609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 461609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->FrameNumWrap > data[i]->FrameNumWrap) 462609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 463609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 464609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 465609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 466609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 467609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 468609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 469609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 470609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 471609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 472609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 473609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* sort frames by LongTermFrameIdx, ascending order */ 474609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid SortFrameByLTFrameIdx(AVCFrameStore *data[], int num) 475609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 476609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j; 477609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCFrameStore *temp; 478609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 479609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 480609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 481609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 482609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 483609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->LongTermFrameIdx < data[i]->LongTermFrameIdx) 484609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 485609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 486609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 487609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 488609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 489609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 490609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 491609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 492609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 493609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 494609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 495609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* sort PictureData by POC in descending order */ 496609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid SortPicByPOC(AVCPictureData *data[], int num, int descending) 497609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 498609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j; 499609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData *temp; 500609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 501609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (descending) 502609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 503609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 504609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 505609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 506609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 507609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->PicOrderCnt > data[i]->PicOrderCnt) 508609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 509609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 510609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 511609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 512609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 513609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 514609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 515609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 516609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 517609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 518609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 519609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 520609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 521609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 522609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->PicOrderCnt < data[i]->PicOrderCnt) 523609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 524609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 525609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 526609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 527609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 528609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 529609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 530609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 531609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 532609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 533609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 534609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* sort PictureData by LongTermPicNum in ascending order */ 535609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid SortPicByLTPicNum(AVCPictureData *data[], int num) 536609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 537609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j; 538609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCPictureData *temp; 539609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 540609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 541609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 542609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 543609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 544609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->LongTermPicNum < data[i]->LongTermPicNum) 545609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 546609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 547609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 548609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 549609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 550609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 551609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 552609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 553609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 554609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 555609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 556609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* sort by PicOrderCnt, descending order */ 557609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid SortFrameByPOC(AVCFrameStore *data[], int num, int descending) 558609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 559609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j; 560609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCFrameStore *temp; 561609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 562609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (descending) 563609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 564609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 565609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 566609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 567609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 568609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->PicOrderCnt > data[i]->PicOrderCnt) 569609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 570609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 571609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 572609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 573609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 574609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 575609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 576609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 577609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 578609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 579609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < num - 1; i++) 580609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 581609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = i + 1; j < num; j++) 582609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 583609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (data[j]->PicOrderCnt < data[i]->PicOrderCnt) 584609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 585609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber temp = data[j]; 586609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[j] = data[i]; 587609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber data[i] = temp; 588609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 589609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 590609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 591609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 592609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 593609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 594609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 595609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 596609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 597