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