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