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 <string.h>
19609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
20609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#include "avclib_common.h"
21609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
22609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2 Decoding process for macroblock to slice group map */
23609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF AVCStatus FMOInit(AVCCommonObj *video)
24609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
25609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    AVCPicParamSet *currPPS = video->currPicParams;
26609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int *MbToSliceGroupMap = video->MbToSliceGroupMap;
27609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int PicSizeInMapUnits = video->PicSizeInMapUnits;
28609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int PicWidthInMbs = video->PicWidthInMbs;
29609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
30609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    if (currPPS->num_slice_groups_minus1 == 0)
31609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
32609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        memset(video->MbToSliceGroupMap, 0, video->PicSizeInMapUnits*sizeof(uint));
33609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
34609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    else
35609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
36609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        switch (currPPS->slice_group_map_type)
37609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
38609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            case 0:
39609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                FmoGenerateType0MapUnitMap(MbToSliceGroupMap, currPPS->run_length_minus1, currPPS->num_slice_groups_minus1, PicSizeInMapUnits);
40609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                break;
41609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            case 1:
42609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                FmoGenerateType1MapUnitMap(MbToSliceGroupMap, PicWidthInMbs, currPPS->num_slice_groups_minus1, PicSizeInMapUnits);
43609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                break;
44609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            case 2:
45609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                FmoGenerateType2MapUnitMap(currPPS, MbToSliceGroupMap, PicWidthInMbs, currPPS->num_slice_groups_minus1, PicSizeInMapUnits);
46609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                break;
47609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            case 3:
48609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                FmoGenerateType3MapUnitMap(video, currPPS, MbToSliceGroupMap, PicWidthInMbs);
49609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                break;
50609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            case 4:
51609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                FmoGenerateType4MapUnitMap(MbToSliceGroupMap, video->MapUnitsInSliceGroup0, currPPS->slice_group_change_direction_flag, PicSizeInMapUnits);
52609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                break;
53609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            case 5:
54609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                FmoGenerateType5MapUnitMap(MbToSliceGroupMap, video, currPPS->slice_group_change_direction_flag, PicSizeInMapUnits);
55609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                break;
56609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            case 6:
57609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                FmoGenerateType6MapUnitMap(MbToSliceGroupMap, (int*)currPPS->slice_group_id, PicSizeInMapUnits);
58609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                break;
59609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            default:
60609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                return AVC_FAIL; /* out of range, shouldn't come this far */
61609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
62609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
63609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
64609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    return AVC_SUCCESS;
65609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
66609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
67609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2.1 interleaved slice group map type*/
68609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid FmoGenerateType0MapUnitMap(int *mapUnitToSliceGroupMap, uint *run_length_minus1, uint num_slice_groups_minus1, uint PicSizeInMapUnits)
69609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
70609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint iGroup, j;
71609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint i = 0;
72609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    do
73609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
74609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (iGroup = 0;
75609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                (iGroup <= num_slice_groups_minus1) && (i < PicSizeInMapUnits);
76609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                i += run_length_minus1[iGroup++] + 1)
77609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
78609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            for (j = 0; j <= run_length_minus1[ iGroup ] && i + j < PicSizeInMapUnits; j++)
79609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                mapUnitToSliceGroupMap[i+j] = iGroup;
80609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
81609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
82609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    while (i < PicSizeInMapUnits);
83609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
84609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
85609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2.2 dispersed slice group map type*/
86609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid FmoGenerateType1MapUnitMap(int *mapUnitToSliceGroupMap, int PicWidthInMbs, uint num_slice_groups_minus1, uint PicSizeInMapUnits)
87609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
88609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint i;
89609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (i = 0; i < PicSizeInMapUnits; i++)
90609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
91609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        mapUnitToSliceGroupMap[i] = ((i % PicWidthInMbs) + (((i / PicWidthInMbs) * (num_slice_groups_minus1 + 1)) / 2))
92609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                    % (num_slice_groups_minus1 + 1);
93609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
94609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
95609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
96609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2.3 foreground with left-over slice group map type */
97609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid FmoGenerateType2MapUnitMap(AVCPicParamSet *pps, int *mapUnitToSliceGroupMap, int PicWidthInMbs,
98609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                uint num_slice_groups_minus1, uint PicSizeInMapUnits)
99609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
100609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int iGroup;
101609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint i, x, y;
102609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint yTopLeft, xTopLeft, yBottomRight, xBottomRight;
103609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
104609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (i = 0; i < PicSizeInMapUnits; i++)
105609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
106609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        mapUnitToSliceGroupMap[ i ] = num_slice_groups_minus1;
107609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
108609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
109609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (iGroup = num_slice_groups_minus1 - 1 ; iGroup >= 0; iGroup--)
110609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
111609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        yTopLeft = pps->top_left[ iGroup ] / PicWidthInMbs;
112609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        xTopLeft = pps->top_left[ iGroup ] % PicWidthInMbs;
113609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        yBottomRight = pps->bottom_right[ iGroup ] / PicWidthInMbs;
114609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        xBottomRight = pps->bottom_right[ iGroup ] % PicWidthInMbs;
115609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (y = yTopLeft; y <= yBottomRight; y++)
116609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
117609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            for (x = xTopLeft; x <= xBottomRight; x++)
118609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
119609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                mapUnitToSliceGroupMap[ y * PicWidthInMbs + x ] = iGroup;
120609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
121609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
122609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
123609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
124609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
125609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
126609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2.4 box-out slice group map type */
127609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* follow the text rather than the JM, it's quite different. */
128609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid FmoGenerateType3MapUnitMap(AVCCommonObj *video, AVCPicParamSet* pps, int *mapUnitToSliceGroupMap,
129609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                int PicWidthInMbs)
130609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
131609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint i, k;
132609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int leftBound, topBound, rightBound, bottomBound;
133609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int x, y, xDir, yDir;
134609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int mapUnitVacant;
135609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint PicSizeInMapUnits = video->PicSizeInMapUnits;
136609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint MapUnitsInSliceGroup0 = video->MapUnitsInSliceGroup0;
137609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
138609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (i = 0; i < PicSizeInMapUnits; i++)
139609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
140609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        mapUnitToSliceGroupMap[ i ] = 1;
141609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
142609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
143609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    x = (PicWidthInMbs - pps->slice_group_change_direction_flag) / 2;
144609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    y = (video->PicHeightInMapUnits - pps->slice_group_change_direction_flag) / 2;
145609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
146609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    leftBound   = x;
147609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    topBound    = y;
148609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    rightBound  = x;
149609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    bottomBound = y;
150609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
151609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    xDir =  pps->slice_group_change_direction_flag - 1;
152609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    yDir =  pps->slice_group_change_direction_flag;
153609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
154609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (k = 0; k < MapUnitsInSliceGroup0; k += mapUnitVacant)
155609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
156609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        mapUnitVacant = (mapUnitToSliceGroupMap[ y * PicWidthInMbs + x ]  ==  1);
157609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (mapUnitVacant)
158609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
159609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            mapUnitToSliceGroupMap[ y * PicWidthInMbs + x ] = 0;
160609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
161609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
162609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (xDir  ==  -1  &&  x  ==  leftBound)
163609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
164609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            leftBound = AVC_MAX(leftBound - 1, 0);
165609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            x = leftBound;
166609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            xDir = 0;
167609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            yDir = 2 * pps->slice_group_change_direction_flag - 1;
168609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
169609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else if (xDir  ==  1  &&  x  ==  rightBound)
170609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
171609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            rightBound = AVC_MIN(rightBound + 1, (int)PicWidthInMbs - 1);
172609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            x = rightBound;
173609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            xDir = 0;
174609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            yDir = 1 - 2 * pps->slice_group_change_direction_flag;
175609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
176609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else if (yDir  ==  -1  &&  y  ==  topBound)
177609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
178609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            topBound = AVC_MAX(topBound - 1, 0);
179609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            y = topBound;
180609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            xDir = 1 - 2 * pps->slice_group_change_direction_flag;
181609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            yDir = 0;
182609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
183609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else  if (yDir  ==  1  &&  y  ==  bottomBound)
184609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
185609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            bottomBound = AVC_MIN(bottomBound + 1, (int)video->PicHeightInMapUnits - 1);
186609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            y = bottomBound;
187609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            xDir = 2 * pps->slice_group_change_direction_flag - 1;
188609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            yDir = 0;
189609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
190609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else
191609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
192609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            x = x + xDir;
193609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            y = y + yDir;
194609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
195609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
196609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
197609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
198609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2.5 raster scan slice group map types */
199609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid FmoGenerateType4MapUnitMap(int *mapUnitToSliceGroupMap, int MapUnitsInSliceGroup0, int slice_group_change_direction_flag, uint PicSizeInMapUnits)
200609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
201609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint sizeOfUpperLeftGroup = slice_group_change_direction_flag ? (PicSizeInMapUnits - MapUnitsInSliceGroup0) : MapUnitsInSliceGroup0;
202609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
203609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint i;
204609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
205609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (i = 0; i < PicSizeInMapUnits; i++)
206609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        if (i < sizeOfUpperLeftGroup)
207609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            mapUnitToSliceGroupMap[ i ] = 1 - slice_group_change_direction_flag;
208609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        else
209609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            mapUnitToSliceGroupMap[ i ] = slice_group_change_direction_flag;
210609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
211609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
212609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
213609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2.6, wipe slice group map type. */
214609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid FmoGenerateType5MapUnitMap(int *mapUnitToSliceGroupMap, AVCCommonObj *video,
215609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                                int slice_group_change_direction_flag, uint PicSizeInMapUnits)
216609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
217609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int PicWidthInMbs = video->PicWidthInMbs;
218609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int PicHeightInMapUnits = video->PicHeightInMapUnits;
219609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int MapUnitsInSliceGroup0 = video->MapUnitsInSliceGroup0;
220609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int sizeOfUpperLeftGroup = slice_group_change_direction_flag ? (PicSizeInMapUnits - MapUnitsInSliceGroup0) : MapUnitsInSliceGroup0;
221609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    int i, j, k = 0;
222609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
223609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (j = 0; j < PicWidthInMbs; j++)
224609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
225609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        for (i = 0; i < PicHeightInMapUnits; i++)
226609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        {
227609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            if (k++ < sizeOfUpperLeftGroup)
228609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
229609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                mapUnitToSliceGroupMap[ i * PicWidthInMbs + j ] = 1 - slice_group_change_direction_flag;
230609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
231609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            else
232609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            {
233609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber                mapUnitToSliceGroupMap[ i * PicWidthInMbs + j ] = slice_group_change_direction_flag;
234609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber            }
235609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        }
236609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
237609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
238609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
239609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* see subclause 8.2.2.7, explicit slice group map */
240609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Hubervoid FmoGenerateType6MapUnitMap(int *mapUnitToSliceGroupMap, int *slice_group_id, uint PicSizeInMapUnits)
241609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{
242609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    uint i;
243609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    for (i = 0; i < PicSizeInMapUnits; i++)
244609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    {
245609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber        mapUnitToSliceGroupMap[i] = slice_group_id[i];
246609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber    }
247609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber}
248609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
249609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber
250