19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* 29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project 39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License. 69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at 79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software 119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and 149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License. 159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "VideoEditorTools.h" 189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "PreviewRenderer.h" 199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*+ Handle the image files here */ 209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <utils/Log.h> 219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*- Handle the image files here */ 229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changconst M4VIFI_UInt8 M4VIFI_ClipTable[1256] 249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang= { 259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 1009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 1019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 1029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 1039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 1049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 1059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 1069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 1079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 1089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 1099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 1109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 1119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 1129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 1139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 1149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 1159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 1169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 1179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 1189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 1199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xfc, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 1209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 1819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 1829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}; 1839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* Division table for ( 65535/x ); x = 0 to 512 */ 1859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changconst M4VIFI_UInt16 M4VIFI_DivTable[512] 1869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang= { 1879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0, 65535, 32768, 21845, 16384, 13107, 10922, 9362, 1889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang8192, 7281, 6553, 5957, 5461, 5041, 4681, 4369, 1899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang4096, 3855, 3640, 3449, 3276, 3120, 2978, 2849, 1909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang2730, 2621, 2520, 2427, 2340, 2259, 2184, 2114, 1919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang2048, 1985, 1927, 1872, 1820, 1771, 1724, 1680, 1929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang1638, 1598, 1560, 1524, 1489, 1456, 1424, 1394, 1939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang1365, 1337, 1310, 1285, 1260, 1236, 1213, 1191, 1949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang1170, 1149, 1129, 1110, 1092, 1074, 1057, 1040, 1959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang1024, 1008, 992, 978, 963, 949, 936, 923, 1969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang910, 897, 885, 873, 862, 851, 840, 829, 1979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang819, 809, 799, 789, 780, 771, 762, 753, 1989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang744, 736, 728, 720, 712, 704, 697, 689, 1999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang682, 675, 668, 661, 655, 648, 642, 636, 2009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang630, 624, 618, 612, 606, 601, 595, 590, 2019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang585, 579, 574, 569, 564, 560, 555, 550, 2029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang546, 541, 537, 532, 528, 524, 520, 516, 2039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang512, 508, 504, 500, 496, 492, 489, 485, 2049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang481, 478, 474, 471, 468, 464, 461, 458, 2059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang455, 451, 448, 445, 442, 439, 436, 434, 2069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang431, 428, 425, 422, 420, 417, 414, 412, 2079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang409, 407, 404, 402, 399, 397, 394, 392, 2089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang390, 387, 385, 383, 381, 378, 376, 374, 2099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang372, 370, 368, 366, 364, 362, 360, 358, 2109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang356, 354, 352, 350, 348, 346, 344, 343, 2119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang341, 339, 337, 336, 334, 332, 330, 329, 2129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang327, 326, 324, 322, 321, 319, 318, 316, 2139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang315, 313, 312, 310, 309, 307, 306, 304, 2149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang303, 302, 300, 299, 297, 296, 295, 293, 2159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang292, 291, 289, 288, 287, 286, 284, 283, 2169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang282, 281, 280, 278, 277, 276, 275, 274, 2179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang273, 271, 270, 269, 268, 267, 266, 265, 2189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang264, 263, 262, 261, 260, 259, 258, 257, 2199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang256, 255, 254, 253, 252, 251, 250, 249, 2209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang248, 247, 246, 245, 244, 243, 242, 241, 2219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang240, 240, 239, 238, 237, 236, 235, 234, 2229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang234, 233, 232, 231, 230, 229, 229, 228, 2239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang227, 226, 225, 225, 224, 223, 222, 222, 2249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang221, 220, 219, 219, 218, 217, 217, 216, 2259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang215, 214, 214, 213, 212, 212, 211, 210, 2269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang210, 209, 208, 208, 207, 206, 206, 205, 2279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang204, 204, 203, 202, 202, 201, 201, 200, 2289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang199, 199, 198, 197, 197, 196, 196, 195, 2299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang195, 194, 193, 193, 192, 192, 191, 191, 2309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang190, 189, 189, 188, 188, 187, 187, 186, 2319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang186, 185, 185, 184, 184, 183, 183, 182, 2329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang182, 181, 181, 180, 180, 179, 179, 178, 2339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang178, 177, 177, 176, 176, 175, 175, 174, 2349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang174, 173, 173, 172, 172, 172, 171, 171, 2359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang170, 170, 169, 169, 168, 168, 168, 167, 2369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang167, 166, 166, 165, 165, 165, 164, 164, 2379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang163, 163, 163, 162, 162, 161, 161, 161, 2389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang160, 160, 159, 159, 159, 158, 158, 157, 2399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang157, 157, 156, 156, 156, 155, 155, 154, 2409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang154, 154, 153, 153, 153, 152, 152, 152, 2419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang151, 151, 151, 150, 150, 149, 149, 149, 2429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang148, 148, 148, 147, 147, 147, 146, 146, 2439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang146, 145, 145, 145, 144, 144, 144, 144, 2449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang143, 143, 143, 142, 142, 142, 141, 141, 2459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang141, 140, 140, 140, 140, 139, 139, 139, 2469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang138, 138, 138, 137, 137, 137, 137, 136, 2479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang136, 136, 135, 135, 135, 135, 134, 134, 2489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang134, 134, 133, 133, 133, 132, 132, 132, 2499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang132, 131, 131, 131, 131, 130, 130, 130, 2509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang130, 129, 129, 129, 129, 128, 128, 128 2519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}; 2529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changconst M4VIFI_Int32 const_storage1[8] 2549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang= { 2559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00002568, 0x00003343,0x00000649,0x00000d0f, 0x0000D86C, 0x0000D83B, 0x00010000, 0x00010000 2569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}; 2579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changconst M4VIFI_Int32 const_storage[8] 2599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang= { 2609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang0x00002568, 0x00003343, 0x1BF800, 0x00000649, 0x00000d0f, 0x110180, 0x40cf, 0x22BE00 2619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}; 2629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changconst M4VIFI_UInt16 *M4VIFI_DivTable_zero 2659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang = &M4VIFI_DivTable[0]; 2669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changconst M4VIFI_UInt8 *M4VIFI_ClipTable_zero 2689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang = &M4VIFI_ClipTable[500]; 2699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_YUV420PlanarToYUV420Semiplanar(void *user_data, 2719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane *PlaneOut ) { 2729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 i; 2749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_buf_src, *p_buf_dest, *p_buf_src_u, *p_buf_src_v; 2759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 return_code = M4VIFI_OK; 2769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* the filter is implemented with the assumption that the width is equal to stride */ 2789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(PlaneIn[0].u_width != PlaneIn[0].u_stride) 2799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_INVALID_PARAM; 2809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* The input Y Plane is the same as the output Y Plane */ 2829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src = &(PlaneIn[0].pac_data[PlaneIn[0].u_topleft]); 2839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest = &(PlaneOut[0].pac_data[PlaneOut[0].u_topleft]); 2849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)p_buf_dest,(void *)p_buf_src , 2859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneOut[0].u_width * PlaneOut[0].u_height); 2869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* The U and V components are planar. The need to be made interleaved */ 2889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src_u = &(PlaneIn[1].pac_data[PlaneIn[1].u_topleft]); 2899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src_v = &(PlaneIn[2].pac_data[PlaneIn[2].u_topleft]); 2909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest = &(PlaneOut[1].pac_data[PlaneOut[1].u_topleft]); 2919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i = 0; i < PlaneOut[1].u_width*PlaneOut[1].u_height; i++) 2939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 2949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_buf_dest++ = *p_buf_src_u++; 2959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_buf_dest++ = *p_buf_src_v++; 2969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 2979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return return_code; 2989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 2999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_SemiplanarYUV420toYUV420(void *user_data, 3019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane *PlaneOut ) { 3029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 i; 3049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_buf_src, *p_buf_dest, *p_buf_src_u, *p_buf_src_v; 3059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_buf_dest_u,*p_buf_dest_v,*p_buf_src_uv; 3069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 return_code = M4VIFI_OK; 3079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* the filter is implemented with the assumption that the width is equal to stride */ 3099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(PlaneIn[0].u_width != PlaneIn[0].u_stride) 3109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_INVALID_PARAM; 3119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* The input Y Plane is the same as the output Y Plane */ 3139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src = &(PlaneIn[0].pac_data[PlaneIn[0].u_topleft]); 3149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest = &(PlaneOut[0].pac_data[PlaneOut[0].u_topleft]); 3159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)p_buf_dest,(void *)p_buf_src , 3169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneOut[0].u_width * PlaneOut[0].u_height); 3179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* The U and V components are planar. The need to be made interleaved */ 3199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src_uv = &(PlaneIn[1].pac_data[PlaneIn[1].u_topleft]); 3209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest_u = &(PlaneOut[1].pac_data[PlaneOut[1].u_topleft]); 3219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest_v = &(PlaneOut[2].pac_data[PlaneOut[2].u_topleft]); 3229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i = 0; i < PlaneOut[1].u_width*PlaneOut[1].u_height; i++) 3249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 3259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_buf_dest_u++ = *p_buf_src_uv++; 3269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_buf_dest_v++ = *p_buf_src_uv++; 3279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 3289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return return_code; 3299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 3309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 3339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 3349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * prototype M4VSS3GPP_externalVideoEffectColor(M4OSA_Void *pFunctionContext, 3359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *PlaneIn, 3369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *PlaneOut, 3379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VSS3GPP_ExternalProgress *pProgress, 3389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_UInt32 uiEffectKind) 3399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 3409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function apply a color effect on an input YUV420 planar frame 3419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note 3429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pFunctionContext(IN) Contains which color to apply (not very clean ...) 3439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param PlaneIn (IN) Input YUV420 planar 3449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param PlaneOut (IN/OUT) Output YUV420 planar 3459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pProgress (IN/OUT) Progress indication (0-100) 3469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param uiEffectKind (IN) Unused 3479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 3489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_OK: No error 3499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 3509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 3519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4VSS3GPP_externalVideoEffectColor(M4OSA_Void *pFunctionContext, 3529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane *PlaneOut, 3539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VSS3GPP_ExternalProgress *pProgress, M4OSA_UInt32 uiEffectKind) { 3549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 plane_number; 3569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 i,j; 3579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_buf_src, *p_buf_dest; 3589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_ColorStruct* ColorContext = (M4xVSS_ColorStruct*)pFunctionContext; 3599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (plane_number = 0; plane_number < 3; plane_number++) 3619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 3629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src = 3639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang &(PlaneIn[plane_number].pac_data[PlaneIn[plane_number].u_topleft]); 3649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest = 3669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang &(PlaneOut[plane_number].pac_data[PlaneOut[plane_number].u_topleft]); 3679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (i = 0; i < PlaneOut[plane_number].u_height; i++) 3689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 3699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 3709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Chrominance */ 3719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(plane_number==1 || plane_number==2) 3729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 3739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang //switch ((M4OSA_UInt32)pFunctionContext) // commented because a structure for the effects context exist 3749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang switch (ColorContext->colorEffectType) 3759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 3769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_BlackAndWhite: 3779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,128, 3789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 3799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 3809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_Pink: 3819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,255, 3829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 3839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 3849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_Green: 3859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,0, 3869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 3879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 3889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_Sepia: 3899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(plane_number==1) 3909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 3919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,117, 3929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 3939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 3949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 3959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 3969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,139, 3979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 3989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 3999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 4009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_Negative: 4019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)p_buf_dest, 4029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (void *)p_buf_src ,PlaneOut[plane_number].u_width); 4039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 4049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_ColorRGB16: 4069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt16 r = 0,g = 0,b = 0,y = 0,u = 0,v = 0; 4089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*first get the r, g, b*/ 4109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang b = (ColorContext->rgb16ColorData & 0x001f); 4119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang g = (ColorContext->rgb16ColorData & 0x07e0)>>5; 4129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang r = (ColorContext->rgb16ColorData & 0xf800)>>11; 4139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*keep y, but replace u and v*/ 4159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(plane_number==1) 4169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*then convert to u*/ 4189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u = U16(r, g, b); 4199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,(M4OSA_UInt8)u, 4209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 4219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(plane_number==2) 4239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*then convert to v*/ 4259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang v = V16(r, g, b); 4269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,(M4OSA_UInt8)v, 4279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 4289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 4319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_Gradient: 4329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt16 r = 0,g = 0,b = 0,y = 0,u = 0,v = 0; 4349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*first get the r, g, b*/ 4369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang b = (ColorContext->rgb16ColorData & 0x001f); 4379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang g = (ColorContext->rgb16ColorData & 0x07e0)>>5; 4389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang r = (ColorContext->rgb16ColorData & 0xf800)>>11; 4399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*for color gradation*/ 4419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang b = (M4OSA_UInt16)( b - ((b*i)/PlaneIn[plane_number].u_height)); 4429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang g = (M4OSA_UInt16)(g - ((g*i)/PlaneIn[plane_number].u_height)); 4439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang r = (M4OSA_UInt16)(r - ((r*i)/PlaneIn[plane_number].u_height)); 4449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*keep y, but replace u and v*/ 4469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(plane_number==1) 4479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*then convert to u*/ 4499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u = U16(r, g, b); 4509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,(M4OSA_UInt8)u, 4519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 4529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(plane_number==2) 4549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*then convert to v*/ 4569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang v = V16(r, g, b); 4579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)p_buf_dest,(M4OSA_UInt8)v, 4589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang PlaneIn[plane_number].u_width); 4599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 4629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang default: 4639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_INVALID_PARAM; 4649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 4679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Luminance */ 4689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 4699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang //switch ((M4OSA_UInt32)pFunctionContext)// commented because a structure for the effects context exist 4719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang switch (ColorContext->colorEffectType) 4729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4xVSS_kVideoEffectType_Negative: 4749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(j=0;j<PlaneOut[plane_number].u_width;j++) 4759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 4769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest[j] = 255 - p_buf_src[j]; 4779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 4799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang default: 4809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)p_buf_dest, 4819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (void *)p_buf_src ,PlaneOut[plane_number].u_width); 4829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 4839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src += PlaneIn[plane_number].u_stride; 4869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest += PlaneOut[plane_number].u_stride; 4879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 4899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_OK; 4919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 4929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 4939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 4949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 4959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * prototype M4VSS3GPP_externalVideoEffectFraming(M4OSA_Void *pFunctionContext, 4969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *PlaneIn, 4979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *PlaneOut, 4989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VSS3GPP_ExternalProgress *pProgress, 4999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_UInt32 uiEffectKind) 5009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 5019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function add a fixed or animated image on an input YUV420 planar frame 5029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note 5039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pFunctionContext(IN) Contains which color to apply (not very clean ...) 5049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param PlaneIn (IN) Input YUV420 planar 5059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param PlaneOut (IN/OUT) Output YUV420 planar 5069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pProgress (IN/OUT) Progress indication (0-100) 5079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param uiEffectKind (IN) Unused 5089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 5099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_OK: No error 5109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 5119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 5129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4VSS3GPP_externalVideoEffectFraming( 5139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Void *userData, M4VIFI_ImagePlane PlaneIn[3], 5149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *PlaneOut, M4VSS3GPP_ExternalProgress *pProgress, 5159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 uiEffectKind ) { 5169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 x,y; 5189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_in_Y = PlaneIn[0].pac_data; 5209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_in_U = PlaneIn[1].pac_data; 5219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_in_V = PlaneIn[2].pac_data; 5229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_FramingStruct* Framing = M4OSA_NULL; 5249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_FramingStruct* currentFraming = M4OSA_NULL; 5259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *FramingRGB = M4OSA_NULL; 5269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_out0; 5289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_out1; 5299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_out2; 5309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 topleft[2]; 5329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8 transparent1 = 5349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_UInt8)((TRANSPARENT_COLOR & 0xFF00)>>8); 5359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8 transparent2 = (M4OSA_UInt8)TRANSPARENT_COLOR; 5369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef DECODE_GIF_ON_SAVING 5389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Framing = (M4xVSS_FramingStruct *)userData; 5399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang currentFraming = (M4xVSS_FramingStruct *)Framing->pCurrent; 5409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FramingRGB = Framing->FramingRgb->pac_data; 5419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif /*DECODE_GIF_ON_SAVING*/ 5429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef DECODE_GIF_ON_SAVING 5449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err; 5459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Framing = 5469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4xVSS_FramingStruct *)((M4xVSS_FramingContext*)userData)->aFramingCtx; 5479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(Framing == M4OSA_NULL) 5489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 5499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((M4xVSS_FramingContext*)userData)->clipTime = pProgress->uiOutputTime; 5509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4xVSS_internalDecodeGIF(userData); 5519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4NO_ERROR != err) 5529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 5539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("M4VSS3GPP_externalVideoEffectFraming: \ 5549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Error in M4xVSS_internalDecodeGIF: 0x%x", err); 5559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 5569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Framing = 5589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4xVSS_FramingStruct *)((M4xVSS_FramingContext*)userData)->aFramingCtx; 5599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Initializes first GIF time */ 5609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((M4xVSS_FramingContext*)userData)->current_gif_time = 5619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pProgress->uiOutputTime; 5629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang currentFraming = (M4xVSS_FramingStruct *)Framing; 5649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FramingRGB = Framing->FramingRgb->pac_data; 5659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif /*DECODE_GIF_ON_SAVING*/ 5669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 5689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Initialize input / output plane pointers */ 5699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_in_Y += PlaneIn[0].u_topleft; 5709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_in_U += PlaneIn[1].u_topleft; 5719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_in_V += PlaneIn[2].u_topleft; 5729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_out0 = PlaneOut[0].pac_data; 5749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_out1 = PlaneOut[1].pac_data; 5759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_out2 = PlaneOut[2].pac_data; 5769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 5789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Depending on time, initialize Framing frame to use */ 5799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(Framing->previousClipTime == -1) 5809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 5819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Framing->previousClipTime = pProgress->uiOutputTime; 5829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 5839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 5859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * If the current clip time has reach the duration of one frame of the framing picture 5869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * we need to step to next framing picture */ 5879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef DECODE_GIF_ON_SAVING 5889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(((M4xVSS_FramingContext*)userData)->b_animated == M4OSA_TRUE) 5899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 5909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang while((((M4xVSS_FramingContext*)userData)->current_gif_time + currentFraming->duration) < pProgress->uiOutputTime) 5919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 5929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((M4xVSS_FramingContext*)userData)->clipTime = 5939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pProgress->uiOutputTime; 5949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 5959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4xVSS_internalDecodeGIF(userData); 5969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4NO_ERROR != err) 5979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 5989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("M4VSS3GPP_externalVideoEffectFraming: Error in M4xVSS_internalDecodeGIF: 0x%x", err); 5999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 6009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(currentFraming->duration != 0) 6029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((M4xVSS_FramingContext*)userData)->current_gif_time += currentFraming->duration; 6049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 6069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((M4xVSS_FramingContext*)userData)->current_gif_time += 6089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pProgress->uiOutputTime - Framing->previousClipTime; 6099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Framing = (M4xVSS_FramingStruct *)((M4xVSS_FramingContext*)userData)->aFramingCtx; 6119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang currentFraming = (M4xVSS_FramingStruct *)Framing; 6129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FramingRGB = Framing->FramingRgb->pac_data; 6139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#else 6169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Framing->pCurrent = currentFraming->pNext; 6179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang currentFraming = (M4xVSS_FramingStruct*)Framing->pCurrent; 6189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif /*DECODE_GIF_ON_SAVING*/ 6199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 6209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Framing->previousClipTime = pProgress->uiOutputTime; 6219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FramingRGB = currentFraming->FramingRgb->pac_data; 6229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang topleft[0] = currentFraming->topleft_x; 6239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang topleft[1] = currentFraming->topleft_y; 6249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 6259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for( x=0 ;x < PlaneIn[0].u_height ; x++) 6269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for( y=0 ;y < PlaneIn[0].u_width ; y++) 6289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 6309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * To handle framing with input size != output size 6319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Framing is applyed if coordinates matches between framing/topleft and input plane */ 6329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( y < (topleft[0] + currentFraming->FramingYuv[0].u_width) && 6339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang y >= topleft[0] && 6349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang x < (topleft[1] + currentFraming->FramingYuv[0].u_height) && 6359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang x >= topleft[1]) 6369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 6389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*Alpha blending support*/ 6399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Float alphaBlending = 1; 6409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef DECODE_GIF_ON_SAVING 6419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_internalEffectsAlphaBlending* alphaBlendingStruct = 6429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4xVSS_internalEffectsAlphaBlending*)((M4xVSS_FramingContext*)userData)->alphaBlendingStruct; 6439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#else 6449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_internalEffectsAlphaBlending* alphaBlendingStruct = 6459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4xVSS_internalEffectsAlphaBlending*)((M4xVSS_FramingStruct*)userData)->alphaBlendingStruct; 6469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif //#ifdef DECODE_GIF_ON_SAVING 6479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 6489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(alphaBlendingStruct != M4OSA_NULL) 6499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pProgress->uiProgress < (M4OSA_UInt32)(alphaBlendingStruct->m_fadeInTime*10)) 6519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang alphaBlending = ((M4OSA_Float)(alphaBlendingStruct->m_middle - alphaBlendingStruct->m_start)*pProgress->uiProgress/(alphaBlendingStruct->m_fadeInTime*10)); 6539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang alphaBlending += alphaBlendingStruct->m_start; 6549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang alphaBlending /= 100; 6559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else if(pProgress->uiProgress >= (M4OSA_UInt32)(alphaBlendingStruct->m_fadeInTime*10) && pProgress->uiProgress < 1000 - (M4OSA_UInt32)(alphaBlendingStruct->m_fadeOutTime*10)) 6579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang alphaBlending = (M4OSA_Float)((M4OSA_Float)alphaBlendingStruct->m_middle/100); 6599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else if(pProgress->uiProgress >= 1000 - (M4OSA_UInt32)(alphaBlendingStruct->m_fadeOutTime*10)) 6619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang alphaBlending = ((M4OSA_Float)(alphaBlendingStruct->m_middle - alphaBlendingStruct->m_end))*(1000 - pProgress->uiProgress)/(alphaBlendingStruct->m_fadeOutTime*10); 6639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang alphaBlending += alphaBlendingStruct->m_end; 6649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang alphaBlending /= 100; 6659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 6689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**/ 6699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 6709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((*(FramingRGB)==transparent1) && (*(FramingRGB+1)==transparent2)) 6719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out0+y+x*PlaneOut[0].u_stride)=(*(p_in_Y+y+x*PlaneIn[0].u_stride)); 6739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)=(*(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride)); 6749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)=(*(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride)); 6759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 6779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out0+y+x*PlaneOut[0].u_stride)=(*(currentFraming->FramingYuv[0].pac_data+(y-topleft[0])+(x-topleft[1])*currentFraming->FramingYuv[0].u_stride))*alphaBlending; 6799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out0+y+x*PlaneOut[0].u_stride)+=(*(p_in_Y+y+x*PlaneIn[0].u_stride))*(1-alphaBlending); 6809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)=(*(currentFraming->FramingYuv[1].pac_data+((y-topleft[0])>>1)+((x-topleft[1])>>1)*currentFraming->FramingYuv[1].u_stride))*alphaBlending; 6819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)+=(*(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride))*(1-alphaBlending); 6829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)=(*(currentFraming->FramingYuv[2].pac_data+((y-topleft[0])>>1)+((x-topleft[1])>>1)*currentFraming->FramingYuv[2].u_stride))*alphaBlending; 6839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)+=(*(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride))*(1-alphaBlending); 6849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( PlaneIn[0].u_width < (topleft[0] + currentFraming->FramingYuv[0].u_width) && 6869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang y == PlaneIn[0].u_width-1) 6879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FramingRGB = FramingRGB + 2 * (topleft[0] + currentFraming->FramingYuv[0].u_width - PlaneIn[0].u_width + 1); 6899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 6919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FramingRGB = FramingRGB + 2; 6939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 6959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 6969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Just copy input plane to output plane */ 6979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 6989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 6999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out0+y+x*PlaneOut[0].u_stride)=*(p_in_Y+y+x*PlaneIn[0].u_stride); 7009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out1+(y>>1)+(x>>1)*PlaneOut[1].u_stride)=*(p_in_U+(y>>1)+(x>>1)*PlaneIn[1].u_stride); 7019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *( p_out2+(y>>1)+(x>>1)*PlaneOut[2].u_stride)=*(p_in_V+(y>>1)+(x>>1)*PlaneIn[2].u_stride); 7029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef DECODE_GIF_ON_SAVING 7079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pProgress->bIsLast == M4OSA_TRUE 7089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang && (M4OSA_Bool)((M4xVSS_FramingContext*)userData)->b_IsFileGif == M4OSA_TRUE) 7099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 7109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_internalDecodeGIF_Cleaning((M4xVSS_FramingContext*)userData); 7119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif /*DECODE_GIF_ON_SAVING*/ 7139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_OK; 7149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 7159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 7189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 7199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * prototype M4VSS3GPP_externalVideoEffectFifties(M4OSA_Void *pFunctionContext, 7209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *PlaneIn, 7219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *PlaneOut, 7229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VSS3GPP_ExternalProgress *pProgress, 7239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_UInt32 uiEffectKind) 7249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 7259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function make a video look as if it was taken in the fifties 7269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note 7279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pUserData (IN) Context 7289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneIn (IN) Input YUV420 planar 7299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneOut (IN/OUT) Output YUV420 planar 7309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pProgress (IN/OUT) Progress indication (0-100) 7319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param uiEffectKind (IN) Unused 7329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 7339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_OK: No error 7349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_PARAMETER: pFiftiesData, pPlaneOut or pProgress are NULL (DEBUG only) 7359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 7369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 7379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4VSS3GPP_externalVideoEffectFifties( 7389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Void *pUserData, M4VIFI_ImagePlane *pPlaneIn, 7399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *pPlaneOut, M4VSS3GPP_ExternalProgress *pProgress, 7409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 uiEffectKind ) 7419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 7429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 x, y, xShift; 7439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pInY = pPlaneIn[0].pac_data; 7449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pOutY, *pInYbegin; 7459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pInCr,* pOutCr; 7469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 plane_number; 7479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Internal context*/ 7499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_FiftiesStruct* p_FiftiesData = (M4xVSS_FiftiesStruct *)pUserData; 7509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Initialize input / output plane pointers */ 7529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInY += pPlaneIn[0].u_topleft; 7539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pOutY = pPlaneOut[0].pac_data; 7549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInYbegin = pInY; 7559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Initialize the random */ 7579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(p_FiftiesData->previousClipTime < 0) 7589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 7599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_randInit(); 7609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_rand((M4OSA_Int32*)&(p_FiftiesData->shiftRandomValue), (pPlaneIn[0].u_height) >> 4); 7619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_rand((M4OSA_Int32*)&(p_FiftiesData->stripeRandomValue), (pPlaneIn[0].u_width)<< 2); 7629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_FiftiesData->previousClipTime = pProgress->uiOutputTime; 7639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Choose random values if we have reached the duration of a partial effect */ 7669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else if( (pProgress->uiOutputTime - p_FiftiesData->previousClipTime) > p_FiftiesData->fiftiesEffectDuration) 7679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 7689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_rand((M4OSA_Int32*)&(p_FiftiesData->shiftRandomValue), (pPlaneIn[0].u_height) >> 4); 7699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_rand((M4OSA_Int32*)&(p_FiftiesData->stripeRandomValue), (pPlaneIn[0].u_width)<< 2); 7709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_FiftiesData->previousClipTime = pProgress->uiOutputTime; 7719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Put in Sepia the chrominance */ 7749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (plane_number = 1; plane_number < 3; plane_number++) 7759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 7769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInCr = pPlaneIn[plane_number].pac_data + pPlaneIn[plane_number].u_topleft; 7779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pOutCr = pPlaneOut[plane_number].pac_data + pPlaneOut[plane_number].u_topleft; 7789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (x = 0; x < pPlaneOut[plane_number].u_height; x++) 7809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 7819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (1 == plane_number) 7829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pOutCr, 117,pPlaneIn[plane_number].u_width); /* U value */ 7839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 7849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pOutCr, 139,pPlaneIn[plane_number].u_width); /* V value */ 7859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInCr += pPlaneIn[plane_number].u_stride; 7879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pOutCr += pPlaneOut[plane_number].u_stride; 7889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 7909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Compute the new pixels values */ 7929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for( x = 0 ; x < pPlaneIn[0].u_height ; x++) 7939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 7949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_outYtmp, *p_inYtmp; 7959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 7969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Compute the xShift (random value) */ 7979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (0 == (p_FiftiesData->shiftRandomValue % 5 )) 7989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang xShift = (x + p_FiftiesData->shiftRandomValue ) % (pPlaneIn[0].u_height - 1); 7999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 8009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang xShift = (x + (pPlaneIn[0].u_height - p_FiftiesData->shiftRandomValue) ) % (pPlaneIn[0].u_height - 1); 8019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Initialize the pointers */ 8039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_outYtmp = pOutY + 1; /* yShift of 1 pixel */ 8049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_inYtmp = pInYbegin + (xShift * pPlaneIn[0].u_stride); /* Apply the xShift */ 8059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for( y = 0 ; y < pPlaneIn[0].u_width ; y++) 8079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set Y value */ 8099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (xShift > (pPlaneIn[0].u_height - 4)) 8109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_outYtmp = 40; /* Add some horizontal black lines between the two parts of the image */ 8119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else if ( y == p_FiftiesData->stripeRandomValue) 8129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_outYtmp = 90; /* Add a random vertical line for the bulk */ 8139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 8149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_outYtmp = *p_inYtmp; 8159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Go to the next pixel */ 8189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_outYtmp++; 8199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_inYtmp++; 8209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Restart at the beginning of the line for the last pixel*/ 8229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (y == (pPlaneIn[0].u_width - 2)) 8239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_outYtmp = pOutY; 8249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Go to the next line */ 8279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pOutY += pPlaneOut[0].u_stride; 8289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_OK; 8319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 8329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changunsigned char M4VFL_modifyLumaWithScale(M4ViComImagePlane *plane_in, 8349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4ViComImagePlane *plane_out, 8359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang unsigned long lum_factor, 8369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang void *user_data) 8379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 8389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang unsigned short *p_src, *p_dest, *p_src_line, *p_dest_line; 8399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang unsigned char *p_csrc, *p_cdest, *p_csrc_line, *p_cdest_line; 8409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang unsigned long pix_src; 8419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang unsigned long u_outpx, u_outpx2; 8429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang unsigned long u_width, u_stride, u_stride_out,u_height, pix; 8439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang long i, j; 8449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* copy or filter chroma */ 8469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_width = plane_in[1].u_width; 8479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_height = plane_in[1].u_height; 8489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_stride = plane_in[1].u_stride; 8499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_stride_out = plane_out[1].u_stride; 8509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest_line = (unsigned char *) &plane_out[1].pac_data[plane_out[1].u_topleft]; 8519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc_line = (unsigned char *) &plane_in[1].pac_data[plane_in[1].u_topleft]; 8529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 8539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (lum_factor > 256) 8549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest = (unsigned char *) &plane_out[2].pac_data[plane_out[2].u_topleft]; 8569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc = (unsigned char *) &plane_in[2].pac_data[plane_in[2].u_topleft]; 8579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* copy chroma */ 8589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (j = u_height; j != 0; j--) 8599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (i = u_width; i != 0; i--) 8619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)p_cdest_line, (void *)p_csrc_line, u_width); 8639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)p_cdest, (void *)p_csrc, u_width); 8649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest_line += u_stride_out; 8669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest += u_stride_out; 8679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc_line += u_stride; 8689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc += u_stride; 8699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 8729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* filter chroma */ 8749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pix = (1024 - lum_factor) << 7; 8759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (j = u_height; j != 0; j--) 8769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest = p_cdest_line; 8789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc = p_csrc_line; 8799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (i = u_width; i != 0; i--) 8809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_cdest++ = ((pix + (*p_csrc++ & 0xFF) * lum_factor) >> LUM_FACTOR_MAX); 8829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest_line += u_stride_out; 8849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc_line += u_stride; 8859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest_line = (unsigned char *) &plane_out[2].pac_data[plane_out[2].u_topleft]; 8879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc_line = (unsigned char *) &plane_in[2].pac_data[plane_in[2].u_topleft]; 8889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (j = u_height; j != 0; j--) 8899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest = p_cdest_line; 8919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc = p_csrc_line; 8929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (i = u_width; i != 0; i--) 8939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 8949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_cdest++ = ((pix + (*p_csrc & 0xFF) * lum_factor) >> LUM_FACTOR_MAX); 8959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_cdest_line += u_stride_out; 8979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_csrc_line += u_stride; 8989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 8999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 9009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* apply luma factor */ 9019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_width = plane_in[0].u_width; 9029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_height = plane_in[0].u_height; 9039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_stride = (plane_in[0].u_stride >> 1); 9049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_stride_out = (plane_out[0].u_stride >> 1); 9059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_dest = (unsigned short *) &plane_out[0].pac_data[plane_out[0].u_topleft]; 9069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_src = (unsigned short *) &plane_in[0].pac_data[plane_in[0].u_topleft]; 9079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_dest_line = p_dest; 9089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_src_line = p_src; 9099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (j = u_height; j != 0; j--) 9119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 9129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_dest = p_dest_line; 9139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_src = p_src_line; 9149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (i = (u_width >> 1); i != 0; i--) 9159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 9169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pix_src = (unsigned long) *p_src++; 9179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pix = pix_src & 0xFF; 9189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_outpx = ((pix * lum_factor) >> LUM_FACTOR_MAX); 9199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pix = ((pix_src & 0xFF00) >> 8); 9209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u_outpx2 = (((pix * lum_factor) >> LUM_FACTOR_MAX)<< 8) ; 9219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *p_dest++ = (unsigned short) (u_outpx2 | u_outpx); 9229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 9239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_dest_line += u_stride_out; 9249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_src_line += u_stride; 9259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 9269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return 0; 9289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 9299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/****************************************************************************** 9319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * prototype M4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx) 9329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function converts an RGB565 plane to YUV420 planar 9339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note It is used only for framing effect 9349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * It allocates output YUV planes 9359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param framingCtx (IN) The framing struct containing input RGB565 plane 9369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 9379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4NO_ERROR: No error 9389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_PARAMETER: At least one of the function parameters is null 9399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_ALLOC: Allocation error (no more memory) 9409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 9419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 9429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4xVSS_internalConvertRGBtoYUV(M4xVSS_FramingStruct* framingCtx) 9439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 9449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err; 9459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 9479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Allocate output YUV planes */ 9489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char*)"M4xVSS_internalConvertRGBtoYUV: Output plane YUV"); 9499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(framingCtx->FramingYuv == M4OSA_NULL) 9509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 9519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV"); 9529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 9539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 9549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_width = framingCtx->FramingRgb->u_width; 9559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_height = framingCtx->FramingRgb->u_height; 9569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_topleft = 0; 9579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_stride = framingCtx->FramingRgb->u_width; 9589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc((framingCtx->FramingYuv[0].u_width*framingCtx->FramingYuv[0].u_height*3)>>1, M4VS, (M4OSA_Char*)"Alloc for the Convertion output YUV");; 9599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(framingCtx->FramingYuv[0].pac_data == M4OSA_NULL) 9609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 9619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV"); 9629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 9639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 9649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_width = (framingCtx->FramingRgb->u_width)>>1; 9659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_height = (framingCtx->FramingRgb->u_height)>>1; 9669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_topleft = 0; 9679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_stride = (framingCtx->FramingRgb->u_width)>>1; 9689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].pac_data = framingCtx->FramingYuv[0].pac_data + framingCtx->FramingYuv[0].u_width * framingCtx->FramingYuv[0].u_height; 9699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_width = (framingCtx->FramingRgb->u_width)>>1; 9709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_height = (framingCtx->FramingRgb->u_height)>>1; 9719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_topleft = 0; 9729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_stride = (framingCtx->FramingRgb->u_width)>>1; 9739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].pac_data = framingCtx->FramingYuv[1].pac_data + framingCtx->FramingYuv[1].u_width * framingCtx->FramingYuv[1].u_height; 9749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 9769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Convert input RGB 565 to YUV 420 to be able to merge it with output video in framing effect */ 9779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VIFI_xVSS_RGB565toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv); 9789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) 9799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 9809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("M4xVSS_internalConvertRGBtoYUV: error when converting from RGB to YUV: 0x%x\n", err); 9819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 9829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->duration = 0; 9849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->previousClipTime = -1; 9859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->previewOffsetClipTime = -1; 9869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 9889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Only one element in the chained list (no animated image with RGB buffer...) */ 9899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->pCurrent = framingCtx; 9909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->pNext = framingCtx; 9919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR; 9939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 9949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 9959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/****************************************************************************** 9969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * prototype M4OSA_ERR M4xVSS_internalConvertRGB888toYUV(M4xVSS_FramingStruct* framingCtx) 9979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function converts an RGB888 plane to YUV420 planar 9989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note It is used only for framing effect 9999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * It allocates output YUV planes 10009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param framingCtx (IN) The framing struct containing input RGB888 plane 10019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * 10029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4NO_ERROR: No error 10039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_PARAMETER: At least one of the function parameters is null 10049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_ALLOC: Allocation error (no more memory) 10059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 10069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 10079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4xVSS_internalConvertRGB888toYUV(M4xVSS_FramingStruct* framingCtx) 10089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 10099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err; 10109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 10129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Allocate output YUV planes */ 10139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char*)"M4xVSS_internalConvertRGBtoYUV: Output plane YUV"); 10149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(framingCtx->FramingYuv == M4OSA_NULL) 10159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 10169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV"); 10179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 10189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 10199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_width = framingCtx->FramingRgb->u_width; 10209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_height = framingCtx->FramingRgb->u_height; 10219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_topleft = 0; 10229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_stride = framingCtx->FramingRgb->u_width; 10239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc((framingCtx->FramingYuv[0].u_width*framingCtx->FramingYuv[0].u_height*3)>>1, M4VS, (M4OSA_Char*)"Alloc for the Convertion output YUV");; 10249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(framingCtx->FramingYuv[0].pac_data == M4OSA_NULL) 10259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 10269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_0("Allocation error in M4xVSS_internalConvertRGBtoYUV"); 10279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 10289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 10299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_width = (framingCtx->FramingRgb->u_width)>>1; 10309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_height = (framingCtx->FramingRgb->u_height)>>1; 10319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_topleft = 0; 10329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_stride = (framingCtx->FramingRgb->u_width)>>1; 10339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].pac_data = framingCtx->FramingYuv[0].pac_data + framingCtx->FramingYuv[0].u_width * framingCtx->FramingYuv[0].u_height; 10349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_width = (framingCtx->FramingRgb->u_width)>>1; 10359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_height = (framingCtx->FramingRgb->u_height)>>1; 10369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_topleft = 0; 10379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_stride = (framingCtx->FramingRgb->u_width)>>1; 10389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].pac_data = framingCtx->FramingYuv[1].pac_data + framingCtx->FramingYuv[1].u_width * framingCtx->FramingYuv[1].u_height; 10399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 10419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Convert input RGB888 to YUV 420 to be able to merge it with output video in framing effect */ 10429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VIFI_RGB888toYUV420(M4OSA_NULL, framingCtx->FramingRgb, framingCtx->FramingYuv); 10439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) 10449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 10459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("M4xVSS_internalConvertRGBtoYUV: error when converting from RGB to YUV: 0x%x\n", err); 10469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 10479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->duration = 0; 10499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->previousClipTime = -1; 10509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->previewOffsetClipTime = -1; 10519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 10539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Only one element in the chained list (no animated image with RGB buffer...) */ 10549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->pCurrent = framingCtx; 10559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->pNext = framingCtx; 10569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR; 10589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 10599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 10619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 10629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_UInt8 M4VIFI_RGB565toYUV420 (void *pUserData, 10639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *pPlaneIn, 10649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *pPlaneOut) 10659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @author Patrice Martinez / Philips Digital Networks - MP4Net 10669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief transform RGB565 image to a YUV420 image. 10679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note Convert RGB565 to YUV420, 10689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Loop on each row ( 2 rows by 2 rows ) 10699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Loop on each column ( 2 col by 2 col ) 10709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Get 4 RGB samples from input data and build 4 output Y samples 10719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * and each single U & V data 10729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * end loop on col 10739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * end loop on row 10749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pUserData: (IN) User Specific Data 10759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneIn: (IN) Pointer to RGB565 Plane 10769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneOut: (OUT) Pointer to YUV420 buffer Plane 10779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_OK: there is no error 10789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_ILLEGAL_FRAME_HEIGHT: YUV Plane height is ODD 10799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_ILLEGAL_FRAME_WIDTH: YUV Plane width is ODD 10809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 10819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 10829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_xVSS_RGB565toYUV420(void *pUserData, M4VIFI_ImagePlane *pPlaneIn, 10839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *pPlaneOut) 10849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 10859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_width, u32_height; 10869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_stride_Y, u32_stride2_Y, u32_stride_U, u32_stride_V; 10879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_stride_rgb, u32_stride_2rgb; 10889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_col, u32_row; 10899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 10909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_r00, i32_r01, i32_r10, i32_r11; 10919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_g00, i32_g01, i32_g10, i32_g11; 10929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_b00, i32_b01, i32_b10, i32_b11; 10939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_y00, i32_y01, i32_y10, i32_y11; 10949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_u00, i32_u01, i32_u10, i32_u11; 10959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_v00, i32_v01, i32_v10, i32_v11; 10969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_yn, *pu8_ys, *pu8_u, *pu8_v; 10979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_y_data, *pu8_u_data, *pu8_v_data; 10989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_rgbn_data, *pu8_rgbn; 10999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt16 u16_pix1, u16_pix2, u16_pix3, u16_pix4; 11009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 count_null=0; 11019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Check planes height are appropriate */ 11039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( (pPlaneIn->u_height != pPlaneOut[0].u_height) || 11049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pPlaneOut[0].u_height != (pPlaneOut[1].u_height<<1)) || 11059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pPlaneOut[0].u_height != (pPlaneOut[2].u_height<<1))) 11069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_ILLEGAL_FRAME_HEIGHT; 11089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 11099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Check planes width are appropriate */ 11119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( (pPlaneIn->u_width != pPlaneOut[0].u_width) || 11129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pPlaneOut[0].u_width != (pPlaneOut[1].u_width<<1)) || 11139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pPlaneOut[0].u_width != (pPlaneOut[2].u_width<<1))) 11149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_ILLEGAL_FRAME_WIDTH; 11169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 11179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set the pointer to the beginning of the output data buffers */ 11199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_y_data = pPlaneOut[0].pac_data + pPlaneOut[0].u_topleft; 11209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u_data = pPlaneOut[1].pac_data + pPlaneOut[1].u_topleft; 11219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v_data = pPlaneOut[2].pac_data + pPlaneOut[2].u_topleft; 11229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set the pointer to the beginning of the input data buffers */ 11249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn_data = pPlaneIn->pac_data + pPlaneIn->u_topleft; 11259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Get the size of the output image */ 11279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width = pPlaneOut[0].u_width; 11289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height = pPlaneOut[0].u_height; 11299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set the size of the memory jumps corresponding to row jump in each output plane */ 11319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_Y = pPlaneOut[0].u_stride; 11329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride2_Y = u32_stride_Y << 1; 11339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_U = pPlaneOut[1].u_stride; 11349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_V = pPlaneOut[2].u_stride; 11359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set the size of the memory jumps corresponding to row jump in input plane */ 11379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_rgb = pPlaneIn->u_stride; 11389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_2rgb = u32_stride_rgb << 1; 11399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Loop on each row of the output image, input coordinates are estimated from output ones */ 11429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Two YUV rows are computed at each pass */ 11439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (u32_row = u32_height ;u32_row != 0; u32_row -=2) 11449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Current Y plane row pointers */ 11469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn = pu8_y_data; 11479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Next Y plane row pointers */ 11489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys = pu8_yn + u32_stride_Y; 11499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Current U plane row pointer */ 11509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u = pu8_u_data; 11519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Current V plane row pointer */ 11529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v = pu8_v_data; 11539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn = pu8_rgbn_data; 11559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Loop on each column of the output image */ 11579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (u32_col = u32_width; u32_col != 0 ; u32_col -=2) 11589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Get four RGB 565 samples from input data */ 11609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u16_pix1 = *( (M4VIFI_UInt16 *) pu8_rgbn); 11619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u16_pix2 = *( (M4VIFI_UInt16 *) (pu8_rgbn + CST_RGB_16_SIZE)); 11629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u16_pix3 = *( (M4VIFI_UInt16 *) (pu8_rgbn + u32_stride_rgb)); 11639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u16_pix4 = *( (M4VIFI_UInt16 *) (pu8_rgbn + u32_stride_rgb + CST_RGB_16_SIZE)); 11649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 11659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Unpack RGB565 to 8bit R, G, B */ 11669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* (x,y) */ 11679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB565(i32_b00,i32_g00,i32_r00,u16_pix1); 11689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* (x+1,y) */ 11699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB565(i32_b10,i32_g10,i32_r10,u16_pix2); 11709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* (x,y+1) */ 11719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB565(i32_b01,i32_g01,i32_r01,u16_pix3); 11729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* (x+1,y+1) */ 11739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB565(i32_b11,i32_g11,i32_r11,u16_pix4); 11749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* If RGB is transparent color (0, 63, 0), we transform it to white (31,63,31) */ 11759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i32_b00 == 0 && i32_g00 == 63 && i32_r00 == 0) 11769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_b00 = 31; 11789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_r00 = 31; 11799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 11809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i32_b10 == 0 && i32_g10 == 63 && i32_r10 == 0) 11819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_b10 = 31; 11839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_r10 = 31; 11849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 11859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i32_b01 == 0 && i32_g01 == 63 && i32_r01 == 0) 11869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_b01 = 31; 11889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_r01 = 31; 11899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 11909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i32_b11 == 0 && i32_g11 == 63 && i32_r11 == 0) 11919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 11929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_b11 = 31; 11939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_r11 = 31; 11949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 11959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Convert RGB value to YUV */ 11969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u00 = U16(i32_r00, i32_g00, i32_b00); 11979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v00 = V16(i32_r00, i32_g00, i32_b00); 11989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* luminance value */ 11999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y00 = Y16(i32_r00, i32_g00, i32_b00); 12009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u10 = U16(i32_r10, i32_g10, i32_b10); 12029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v10 = V16(i32_r10, i32_g10, i32_b10); 12039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* luminance value */ 12049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y10 = Y16(i32_r10, i32_g10, i32_b10); 12059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u01 = U16(i32_r01, i32_g01, i32_b01); 12079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v01 = V16(i32_r01, i32_g01, i32_b01); 12089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* luminance value */ 12099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y01 = Y16(i32_r01, i32_g01, i32_b01); 12109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u11 = U16(i32_r11, i32_g11, i32_b11); 12129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v11 = V16(i32_r11, i32_g11, i32_b11); 12139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* luminance value */ 12149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y11 = Y16(i32_r11, i32_g11, i32_b11); 12159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Store luminance data */ 12179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn[0] = (M4VIFI_UInt8)i32_y00; 12189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn[1] = (M4VIFI_UInt8)i32_y10; 12199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys[0] = (M4VIFI_UInt8)i32_y01; 12209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys[1] = (M4VIFI_UInt8)i32_y11; 12219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_u = (M4VIFI_UInt8)((i32_u00 + i32_u01 + i32_u10 + i32_u11 + 2) >> 2); 12229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_v = (M4VIFI_UInt8)((i32_v00 + i32_v01 + i32_v10 + i32_v11 + 2) >> 2); 12239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Prepare for next column */ 12249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn += (CST_RGB_16_SIZE<<1); 12259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update current Y plane line pointer*/ 12269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn += 2; 12279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update next Y plane line pointer*/ 12289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys += 2; 12299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update U plane line pointer*/ 12309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u ++; 12319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update V plane line pointer*/ 12329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v ++; 12339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } /* End of horizontal scanning */ 12349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Prepare pointers for the next row */ 12369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_y_data += u32_stride2_Y; 12379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u_data += u32_stride_U; 12389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v_data += u32_stride_V; 12399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn_data += u32_stride_2rgb; 12409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } /* End of vertical scanning */ 12439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_OK; 12459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 12469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*************************************************************************** 12489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangProto: 12499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_RGB888toYUV420(void *pUserData, M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane PlaneOut[3]); 12509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangAuthor: Patrice Martinez / Philips Digital Networks - MP4Net 12519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangPurpose: filling of the YUV420 plane from a BGR24 plane 12529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangAbstract: Loop on each row ( 2 rows by 2 rows ) 12539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Loop on each column ( 2 col by 2 col ) 12549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Get 4 BGR samples from input data and build 4 output Y samples and each single U & V data 12559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang end loop on col 12569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang end loop on row 12579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangIn: RGB24 plane 12599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangInOut: none 12609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangOut: array of 3 M4VIFI_ImagePlane structures 12619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangModified: ML: RGB function modified to BGR. 12629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang***************************************************************************/ 12639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_RGB888toYUV420(void *pUserData, M4VIFI_ImagePlane *PlaneIn, M4VIFI_ImagePlane PlaneOut[3]) 12649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 12659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_width, u32_height; 12679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_stride_Y, u32_stride2_Y, u32_stride_U, u32_stride_V, u32_stride_rgb, u32_stride_2rgb; 12689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_col, u32_row; 12699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_r00, i32_r01, i32_r10, i32_r11; 12719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_g00, i32_g01, i32_g10, i32_g11; 12729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_b00, i32_b01, i32_b10, i32_b11; 12739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_y00, i32_y01, i32_y10, i32_y11; 12749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_u00, i32_u01, i32_u10, i32_u11; 12759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 i32_v00, i32_v01, i32_v10, i32_v11; 12769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_yn, *pu8_ys, *pu8_u, *pu8_v; 12779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_y_data, *pu8_u_data, *pu8_v_data; 12789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_rgbn_data, *pu8_rgbn; 12799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* check sizes */ 12819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( (PlaneIn->u_height != PlaneOut[0].u_height) || 12829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (PlaneOut[0].u_height != (PlaneOut[1].u_height<<1)) || 12839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (PlaneOut[0].u_height != (PlaneOut[2].u_height<<1))) 12849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_ILLEGAL_FRAME_HEIGHT; 12859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( (PlaneIn->u_width != PlaneOut[0].u_width) || 12879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (PlaneOut[0].u_width != (PlaneOut[1].u_width<<1)) || 12889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (PlaneOut[0].u_width != (PlaneOut[2].u_width<<1))) 12899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_ILLEGAL_FRAME_WIDTH; 12909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* set the pointer to the beginning of the output data buffers */ 12939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_y_data = PlaneOut[0].pac_data + PlaneOut[0].u_topleft; 12949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u_data = PlaneOut[1].pac_data + PlaneOut[1].u_topleft; 12959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v_data = PlaneOut[2].pac_data + PlaneOut[2].u_topleft; 12969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 12979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* idem for input buffer */ 12989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn_data = PlaneIn->pac_data + PlaneIn->u_topleft; 12999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* get the size of the output image */ 13019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width = PlaneOut[0].u_width; 13029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height = PlaneOut[0].u_height; 13039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* set the size of the memory jumps corresponding to row jump in each output plane */ 13059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_Y = PlaneOut[0].u_stride; 13069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride2_Y= u32_stride_Y << 1; 13079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_U = PlaneOut[1].u_stride; 13089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_V = PlaneOut[2].u_stride; 13099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* idem for input plane */ 13119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_rgb = PlaneIn->u_stride; 13129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_2rgb = u32_stride_rgb << 1; 13139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* loop on each row of the output image, input coordinates are estimated from output ones */ 13159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* two YUV rows are computed at each pass */ 13169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (u32_row = u32_height ;u32_row != 0; u32_row -=2) 13179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 13189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* update working pointers */ 13199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn = pu8_y_data; 13209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys = pu8_yn + u32_stride_Y; 13219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u = pu8_u_data; 13239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v = pu8_v_data; 13249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn= pu8_rgbn_data; 13269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* loop on each column of the output image*/ 13289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (u32_col = u32_width; u32_col != 0 ; u32_col -=2) 13299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 13309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* get RGB samples of 4 pixels */ 13319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB24(i32_r00, i32_g00, i32_b00, pu8_rgbn, 0); 13329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB24(i32_r10, i32_g10, i32_b10, pu8_rgbn, CST_RGB_24_SIZE); 13339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB24(i32_r01, i32_g01, i32_b01, pu8_rgbn, u32_stride_rgb); 13349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang GET_RGB24(i32_r11, i32_g11, i32_b11, pu8_rgbn, u32_stride_rgb + CST_RGB_24_SIZE); 13359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u00 = U24(i32_r00, i32_g00, i32_b00); 13379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v00 = V24(i32_r00, i32_g00, i32_b00); 13389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y00 = Y24(i32_r00, i32_g00, i32_b00); /* matrix luminance */ 13399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn[0]= (M4VIFI_UInt8)i32_y00; 13409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u10 = U24(i32_r10, i32_g10, i32_b10); 13429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v10 = V24(i32_r10, i32_g10, i32_b10); 13439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y10 = Y24(i32_r10, i32_g10, i32_b10); 13449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn[1]= (M4VIFI_UInt8)i32_y10; 13459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u01 = U24(i32_r01, i32_g01, i32_b01); 13479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v01 = V24(i32_r01, i32_g01, i32_b01); 13489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y01 = Y24(i32_r01, i32_g01, i32_b01); 13499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys[0]= (M4VIFI_UInt8)i32_y01; 13509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_u11 = U24(i32_r11, i32_g11, i32_b11); 13529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_v11 = V24(i32_r11, i32_g11, i32_b11); 13539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_y11 = Y24(i32_r11, i32_g11, i32_b11); 13549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys[1] = (M4VIFI_UInt8)i32_y11; 13559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_u = (M4VIFI_UInt8)((i32_u00 + i32_u01 + i32_u10 + i32_u11 + 2) >> 2); 13579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_v = (M4VIFI_UInt8)((i32_v00 + i32_v01 + i32_v10 + i32_v11 + 2) >> 2); 13589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn += (CST_RGB_24_SIZE<<1); 13609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_yn += 2; 13619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_ys += 2; 13629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u ++; 13649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v ++; 13659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } /* end of horizontal scanning */ 13669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_y_data += u32_stride2_Y; 13689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_u_data += u32_stride_U; 13699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_v_data += u32_stride_V; 13709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_rgbn_data += u32_stride_2rgb; 13719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } /* End of vertical scanning */ 13749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_OK; 13769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 13779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** YUV420 to YUV420 */ 13799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 13809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ******************************************************************************************* 13819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_UInt8 M4VIFI_YUV420toYUV420 (void *pUserData, 13829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *pPlaneIn, 13839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *pPlaneOut) 13849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief Transform YUV420 image to a YUV420 image. 13859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pUserData: (IN) User Specific Data (Unused - could be NULL) 13869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneIn: (IN) Pointer to YUV plane buffer 13879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneOut: (OUT) Pointer to YUV Plane 13889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_OK: there is no error 13899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_ILLEGAL_FRAME_HEIGHT: Error in plane height 13909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_ILLEGAL_FRAME_WIDTH: Error in plane width 13919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ******************************************************************************************* 13929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 13939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 13949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_YUV420toYUV420(void *user_data, M4VIFI_ImagePlane PlaneIn[3], M4VIFI_ImagePlane *PlaneOut ) 13959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 13969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_Int32 plane_number; 13979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 i; 13989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *p_buf_src, *p_buf_dest; 13999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (plane_number = 0; plane_number < 3; plane_number++) 14019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 14029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src = &(PlaneIn[plane_number].pac_data[PlaneIn[plane_number].u_topleft]); 14039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest = &(PlaneOut[plane_number].pac_data[PlaneOut[plane_number].u_topleft]); 14049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (i = 0; i < PlaneOut[plane_number].u_height; i++) 14059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 14069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)p_buf_dest, (void *)p_buf_src ,PlaneOut[plane_number].u_width); 14079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_src += PlaneIn[plane_number].u_stride; 14089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang p_buf_dest += PlaneOut[plane_number].u_stride; 14099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 14109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 14119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_OK; 14129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 14139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 14159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *********************************************************************************************** 14169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_UInt8 M4VIFI_ResizeBilinearYUV420toYUV420(void *pUserData, M4VIFI_ImagePlane *pPlaneIn, 14179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4VIFI_ImagePlane *pPlaneOut) 14189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @author David Dana (PHILIPS Software) 14199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief Resizes YUV420 Planar plane. 14209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note Basic structure of the function 14219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Loop on each row (step 2) 14229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Loop on each column (step 2) 14239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Get four Y samples and 1 U & V sample 14249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Resize the Y with corresponing U and V samples 14259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Place the YUV in the ouput plane 14269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * end loop column 14279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * end loop row 14289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * For resizing bilinear interpolation linearly interpolates along 14299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * each row, and then uses that result in a linear interpolation down each column. 14309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Each estimated pixel in the output image is a weighted 14319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * combination of its four neighbours. The ratio of compression 14329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * or dilatation is estimated using input and output sizes. 14339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pUserData: (IN) User Data 14349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneIn: (IN) Pointer to YUV420 (Planar) plane buffer 14359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pPlaneOut: (OUT) Pointer to YUV420 (Planar) plane 14369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_OK: there is no error 14379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_ILLEGAL_FRAME_HEIGHT: Error in height 14389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4VIFI_ILLEGAL_FRAME_WIDTH: Error in width 14399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *********************************************************************************************** 14409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 14419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4VIFI_UInt8 M4VIFI_ResizeBilinearYUV420toYUV420(void *pUserData, 14429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *pPlaneIn, 14439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *pPlaneOut) 14449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 14459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_data_in, *pu8_data_out, *pu8dum; 14469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_plane; 14479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_width_in, u32_width_out, u32_height_in, u32_height_out; 14489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_stride_in, u32_stride_out; 14499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_x_inc, u32_y_inc; 14509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_x_accum, u32_y_accum, u32_x_accum_start; 14519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_width, u32_height; 14529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_y_frac; 14539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_x_frac; 14549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 u32_temp_value; 14559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_src_top; 14569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *pu8_src_bottom; 14579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 u8Wflag = 0; 14599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 u8Hflag = 0; 14609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt32 loop = 0; 14619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 14649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang If input width is equal to output width and input height equal to 14659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang output height then M4VIFI_YUV420toYUV420 is called. 14669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 14679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if ((pPlaneIn[0].u_height == pPlaneOut[0].u_height) && 14689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pPlaneIn[0].u_width == pPlaneOut[0].u_width)) 14699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 14709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_YUV420toYUV420(pUserData, pPlaneIn, pPlaneOut); 14719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 14729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Check for the YUV width and height are even */ 14749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if ((IS_EVEN(pPlaneIn[0].u_height) == FALSE) || 14759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (IS_EVEN(pPlaneOut[0].u_height) == FALSE)) 14769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 14779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_ILLEGAL_FRAME_HEIGHT; 14789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 14799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if ((IS_EVEN(pPlaneIn[0].u_width) == FALSE) || 14819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (IS_EVEN(pPlaneOut[0].u_width) == FALSE)) 14829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 14839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_ILLEGAL_FRAME_WIDTH; 14849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 14859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Loop on planes */ 14879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(u32_plane = 0;u32_plane < PLANES;u32_plane++) 14889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 14899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set the working pointers at the beginning of the input/output data field */ 14909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pPlaneIn[u32_plane].pac_data + pPlaneIn[u32_plane].u_topleft; 14919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out = pPlaneOut[u32_plane].pac_data + pPlaneOut[u32_plane].u_topleft; 14929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Get the memory jump corresponding to a row jump */ 14949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_in = pPlaneIn[u32_plane].u_stride; 14959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_stride_out = pPlaneOut[u32_plane].u_stride; 14969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 14979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set the bounds of the active image */ 14989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width_in = pPlaneIn[u32_plane].u_width; 14999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height_in = pPlaneIn[u32_plane].u_height; 15009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width_out = pPlaneOut[u32_plane].u_width; 15029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height_out = pPlaneOut[u32_plane].u_height; 15039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 15059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang For the case , width_out = width_in , set the flag to avoid 15069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang accessing one column beyond the input width.In this case the last 15079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang column is replicated for processing 15089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 15099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_width_out == u32_width_in) { 15109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width_out = u32_width_out-1; 15119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u8Wflag = 1; 15129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Compute horizontal ratio between src and destination width.*/ 15159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_width_out >= u32_width_in) 15169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_inc = ((u32_width_in-1) * MAX_SHORT) / (u32_width_out-1); 15189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 15209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_inc = (u32_width_in * MAX_SHORT) / (u32_width_out); 15229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 15259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang For the case , height_out = height_in , set the flag to avoid 15269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang accessing one row beyond the input height.In this case the last 15279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang row is replicated for processing 15289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 15299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_height_out == u32_height_in) { 15309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height_out = u32_height_out-1; 15319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u8Hflag = 1; 15329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Compute vertical ratio between src and destination height.*/ 15359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_height_out >= u32_height_in) 15369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_inc = ((u32_height_in - 1) * MAX_SHORT) / (u32_height_out-1); 15389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 15409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_inc = (u32_height_in * MAX_SHORT) / (u32_height_out); 15429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 15459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Calculate initial accumulator value : u32_y_accum_start. 15469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum_start is coded on 15 bits, and represents a value 15479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang between 0 and 0.5 15489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 15499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_y_inc >= MAX_SHORT) 15509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 15529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Keep the fractionnal part, assimung that integer part is coded 15539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang on the 16 high bits and the fractional on the 15 low bits 15549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 15559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum = u32_y_inc & 0xffff; 15569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (!u32_y_accum) 15589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum = MAX_SHORT; 15609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum >>= 1; 15639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 15659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum = 0; 15679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 15719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Calculate initial accumulator value : u32_x_accum_start. 15729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum_start is coded on 15 bits, and represents a value 15739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang between 0 and 0.5 15749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 15759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_x_inc >= MAX_SHORT) 15769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum_start = u32_x_inc & 0xffff; 15789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (!u32_x_accum_start) 15809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum_start = MAX_SHORT; 15829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum_start >>= 1; 15859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 15879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 15889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum_start = 0; 15899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 15909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height = u32_height_out; 15929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 15939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 15949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Bilinear interpolation linearly interpolates along each row, and 15959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang then uses that result in a linear interpolation donw each column. 15969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Each estimated pixel in the output image is a weighted combination 15979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang of its four neighbours according to the formula: 15989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang F(p',q')=f(p,q)R(-a)R(b)+f(p,q-1)R(-a)R(b-1)+f(p+1,q)R(1-a)R(b)+ 15999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang f(p+&,q+1)R(1-a)R(b-1) with R(x) = / x+1 -1 =< x =< 0 \ 1-x 16009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 0 =< x =< 1 and a (resp. b)weighting coefficient is the distance 16019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang from the nearest neighbor in the p (resp. q) direction 16029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 16039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang do { /* Scan all the row */ 16059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Vertical weight factor */ 16079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_frac = (u32_y_accum>>12)&15; 16089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Reinit accumulator */ 16109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum = u32_x_accum_start; 16119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width = u32_width_out; 16139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang do { /* Scan along each row */ 16159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = pu8_data_in + (u32_x_accum >> 16); 16169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + u32_stride_in; 16179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_frac = (u32_x_accum >> 12)&15; /* Horizontal weight factor */ 16189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 16209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 16219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 16229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[0]*(16-u32_x_frac) + 16239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 16249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 16269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update horizontal accumulator */ 16289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum += u32_x_inc; 16299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } while(--u32_width); 16309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 16329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang This u8Wflag flag gets in to effect if input and output 16339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang width is same, and height may be different. So previous 16349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pixel is replicated here 16359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 16369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u8Wflag) { 16379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out = (M4VIFI_UInt8)u32_temp_value; 16389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8dum = (pu8_data_out-u32_width_out); 16419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out = pu8_data_out + u32_stride_out - u32_width_out; 16429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update vertical accumulator */ 16449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum += u32_y_inc; 16459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_y_accum>>16) { 16469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * u32_stride_in; 16479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum &= 0xffff; 16489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } while(--u32_height); 16509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 16529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang This u8Hflag flag gets in to effect if input and output height 16539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang is same, and width may be different. So previous pixel row is 16549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang replicated here 16559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 16569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u8Hflag) { 16579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(loop =0; loop < (u32_width_out+u8Wflag); loop++) { 16589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)*pu8dum++; 16599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4VIFI_OK; 16649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 16659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyRenderingMode(M4VIFI_ImagePlane* pPlaneIn, M4VIFI_ImagePlane* pPlaneOut, M4xVSS_MediaRendering mediaRendering) 16679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 16689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 16699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(mediaRendering == M4xVSS_kResizing) 16719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 16729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 16739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Call the resize filter. From the intermediate frame to the encoder image plane */ 16749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VIFI_ResizeBilinearYUV420toYUV420(M4OSA_NULL, pPlaneIn, pPlaneOut); 16759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (M4NO_ERROR != err) 16769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 16779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("applyRenderingMode: M4ViFilResizeBilinearYUV420toYUV420 returns 0x%x!", err); 16789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 16799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 16819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 16829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 16839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_Params Params; 16849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Context m_air_context; 16859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane pImagePlanesTemp[3]; 16869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane* pPlaneTemp; 16879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8* pOutPlaneY = pPlaneOut[0].pac_data + pPlaneOut[0].u_topleft; 16889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8* pOutPlaneU = pPlaneOut[1].pac_data + pPlaneOut[1].u_topleft; 16899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8* pOutPlaneV = pPlaneOut[2].pac_data + pPlaneOut[2].u_topleft; 16909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8* pInPlaneY = NULL; 16919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8* pInPlaneU = NULL; 16929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8* pInPlaneV = NULL; 16939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 i; 16949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 16959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*to keep media aspect ratio*/ 16969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*Initialize AIR Params*/ 16979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputCoord.m_x = 0; 16989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputCoord.m_y = 0; 16999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_height = pPlaneIn->u_height; 17009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_width = pPlaneIn->u_width; 17019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_width = pPlaneOut->u_width; 17029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_height = pPlaneOut->u_height; 17039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_bOutputStripe = M4OSA_FALSE; 17049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputOrientation = M4COMMON_kOrientationTopLeft; 17059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 17079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Media rendering: Black borders*/ 17089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(mediaRendering == M4xVSS_kBlackBorders) 17099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 17109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pPlaneOut[0].pac_data,Y_PLANE_BORDER_VALUE,(pPlaneOut[0].u_height*pPlaneOut[0].u_stride)); 17119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pPlaneOut[1].pac_data,U_PLANE_BORDER_VALUE,(pPlaneOut[1].u_height*pPlaneOut[1].u_stride)); 17129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pPlaneOut[2].pac_data,V_PLANE_BORDER_VALUE,(pPlaneOut[2].u_height*pPlaneOut[2].u_stride)); 17139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_width = pPlaneOut[0].u_width; 17159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_height = pPlaneOut[0].u_height; 17169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_stride = pPlaneOut[0].u_width; 17179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_topleft = 0; 17189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].pac_data = M4OSA_NULL; 17199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_width = pPlaneOut[1].u_width; 17219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_height = pPlaneOut[1].u_height; 17229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_stride = pPlaneOut[1].u_width; 17239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_topleft = 0; 17249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].pac_data = M4OSA_NULL; 17259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_width = pPlaneOut[2].u_width; 17279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_height = pPlaneOut[2].u_height; 17289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_stride = pPlaneOut[2].u_width; 17299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_topleft = 0; 17309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].pac_data = M4OSA_NULL; 17319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Allocates plan in local image plane structure */ 17339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].pac_data = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(pImagePlanesTemp[0].u_width * pImagePlanesTemp[0].u_height, M4VS, (M4OSA_Char*)"applyRenderingMode: temporary plane bufferY") ; 17349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pImagePlanesTemp[0].pac_data == M4OSA_NULL) 17359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 17369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_0("Error alloc in applyRenderingMode"); 17379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 17389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 17399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].pac_data = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(pImagePlanesTemp[1].u_width * pImagePlanesTemp[1].u_height, M4VS, (M4OSA_Char*)"applyRenderingMode: temporary plane bufferU") ; 17409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pImagePlanesTemp[1].pac_data == M4OSA_NULL) 17419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 17429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_0("Error alloc in applyRenderingMode"); 17449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 17459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 17469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].pac_data = (M4OSA_UInt8*)M4OSA_32bitAlignedMalloc(pImagePlanesTemp[2].u_width * pImagePlanesTemp[2].u_height, M4VS, (M4OSA_Char*)"applyRenderingMode: temporary plane bufferV") ; 17479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pImagePlanesTemp[2].pac_data == M4OSA_NULL) 17489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 17499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_0("Error alloc in applyRenderingMode"); 17519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 17529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 17539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInPlaneY = pImagePlanesTemp[0].pac_data ; 17559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInPlaneU = pImagePlanesTemp[1].pac_data ; 17569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInPlaneV = pImagePlanesTemp[2].pac_data ; 17579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pImagePlanesTemp[0].pac_data,Y_PLANE_BORDER_VALUE,(pImagePlanesTemp[0].u_height*pImagePlanesTemp[0].u_stride)); 17599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pImagePlanesTemp[1].pac_data,U_PLANE_BORDER_VALUE,(pImagePlanesTemp[1].u_height*pImagePlanesTemp[1].u_stride)); 17609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memset((void *)pImagePlanesTemp[2].pac_data,V_PLANE_BORDER_VALUE,(pImagePlanesTemp[2].u_height*pImagePlanesTemp[2].u_stride)); 17619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((M4OSA_UInt32)((pPlaneIn->u_height * pPlaneOut->u_width) /pPlaneIn->u_width) <= pPlaneOut->u_height)//Params.m_inputSize.m_height < Params.m_inputSize.m_width) 17639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 17649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*it is height so black borders will be on the top and on the bottom side*/ 17659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_width = pPlaneOut->u_width; 17669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_height = (M4OSA_UInt32)((pPlaneIn->u_height * pPlaneOut->u_width) /pPlaneIn->u_width); 17679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*number of lines at the top*/ 17689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_topleft = (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[0].u_height-Params.m_outputSize.m_height)>>1))*pImagePlanesTemp[0].u_stride; 17699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_height = Params.m_outputSize.m_height; 17709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_topleft = (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_height-(Params.m_outputSize.m_height>>1)))>>1)*pImagePlanesTemp[1].u_stride; 17719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_height = Params.m_outputSize.m_height>>1; 17729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_topleft = (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_height-(Params.m_outputSize.m_height>>1)))>>1)*pImagePlanesTemp[2].u_stride; 17739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_height = Params.m_outputSize.m_height>>1; 17749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 17759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 17769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 17779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*it is width so black borders will be on the left and right side*/ 17789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_height = pPlaneOut->u_height; 17799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_width = (M4OSA_UInt32)((pPlaneIn->u_width * pPlaneOut->u_height) /pPlaneIn->u_height); 17809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_topleft = (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[0].u_width-Params.m_outputSize.m_width)>>1)); 17829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_width = Params.m_outputSize.m_width; 17839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_topleft = (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[1].u_width-(Params.m_outputSize.m_width>>1)))>>1); 17849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_width = Params.m_outputSize.m_width>>1; 17859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_topleft = (M4xVSS_ABS((M4OSA_Int32)(pImagePlanesTemp[2].u_width-(Params.m_outputSize.m_width>>1)))>>1); 17869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_width = Params.m_outputSize.m_width>>1; 17879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 17889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 17899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*Width and height have to be even*/ 17909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_width = (Params.m_outputSize.m_width>>1)<<1; 17919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_height = (Params.m_outputSize.m_height>>1)<<1; 17929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1; 17939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1; 17949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_width = (pImagePlanesTemp[0].u_width>>1)<<1; 17959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_width = (pImagePlanesTemp[1].u_width>>1)<<1; 17969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_width = (pImagePlanesTemp[2].u_width>>1)<<1; 17979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[0].u_height = (pImagePlanesTemp[0].u_height>>1)<<1; 17989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[1].u_height = (pImagePlanesTemp[1].u_height>>1)<<1; 17999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[2].u_height = (pImagePlanesTemp[2].u_height>>1)<<1; 18009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*Check that values are coherent*/ 18029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(Params.m_inputSize.m_height == Params.m_outputSize.m_height) 18039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_width = Params.m_outputSize.m_width; 18059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else if(Params.m_inputSize.m_width == Params.m_outputSize.m_width) 18079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_height = Params.m_outputSize.m_height; 18099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pPlaneTemp = pImagePlanesTemp; 18119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 18169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Media rendering: Cropping*/ 18179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(mediaRendering == M4xVSS_kCropping) 18189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_height = pPlaneOut->u_height; 18209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_outputSize.m_width = pPlaneOut->u_width; 18219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((Params.m_outputSize.m_height * Params.m_inputSize.m_width) /Params.m_outputSize.m_width<Params.m_inputSize.m_height) 18229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*height will be cropped*/ 18249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_height = (M4OSA_UInt32)((Params.m_outputSize.m_height * Params.m_inputSize.m_width) /Params.m_outputSize.m_width); 18259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_height = (Params.m_inputSize.m_height>>1)<<1; 18269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputCoord.m_y = (M4OSA_Int32)((M4OSA_Int32)((pPlaneIn->u_height - Params.m_inputSize.m_height))>>1); 18279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 18299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /*width will be cropped*/ 18319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_width = (M4OSA_UInt32)((Params.m_outputSize.m_width * Params.m_inputSize.m_height) /Params.m_outputSize.m_height); 18329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputSize.m_width = (Params.m_inputSize.m_width>>1)<<1; 18339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Params.m_inputCoord.m_x = (M4OSA_Int32)((M4OSA_Int32)((pPlaneIn->u_width - Params.m_inputSize.m_width))>>1); 18349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pPlaneTemp = pPlaneOut; 18369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 18399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Call AIR functions */ 18409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4AIR_create(&m_air_context, M4AIR_kYUV420P); 18419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) 18429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("applyRenderingMode: Error when initializing AIR: 0x%x", err); 18459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0; i<3; i++) 18469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pImagePlanesTemp[i].pac_data != M4OSA_NULL) 18489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pImagePlanesTemp[i].pac_data); 18509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[i].pac_data = M4OSA_NULL; 18519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 18549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4AIR_configure(m_air_context, &Params); 18589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) 18599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("applyRenderingMode: Error when configuring AIR: 0x%x", err); 18629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_cleanUp(m_air_context); 18639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0; i<3; i++) 18649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pImagePlanesTemp[i].pac_data != M4OSA_NULL) 18669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pImagePlanesTemp[i].pac_data); 18689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[i].pac_data = M4OSA_NULL; 18699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 18729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4AIR_get(m_air_context, pPlaneIn, pPlaneTemp); 18759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) 18769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_TRACE1_1("applyRenderingMode: Error when getting AIR plane: 0x%x", err); 18789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_cleanUp(m_air_context); 18799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0; i<3; i++) 18809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pImagePlanesTemp[i].pac_data != M4OSA_NULL) 18829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pImagePlanesTemp[i].pac_data); 18849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[i].pac_data = M4OSA_NULL; 18859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 18889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 18909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(mediaRendering == M4xVSS_kBlackBorders) 18919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0; i<pPlaneOut[0].u_height; i++) 18939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 18949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)pOutPlaneY, (void *)pInPlaneY, pPlaneOut[0].u_width); 18959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInPlaneY += pPlaneOut[0].u_width; 18969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pOutPlaneY += pPlaneOut[0].u_stride; 18979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 18989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0; i<pPlaneOut[1].u_height; i++) 18999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 19009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)pOutPlaneU, (void *)pInPlaneU, pPlaneOut[1].u_width); 19019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInPlaneU += pPlaneOut[1].u_width; 19029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pOutPlaneU += pPlaneOut[1].u_stride; 19039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 19049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0; i<pPlaneOut[2].u_height; i++) 19059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 19069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)pOutPlaneV, (void *)pInPlaneV, pPlaneOut[2].u_width); 19079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pInPlaneV += pPlaneOut[2].u_width; 19089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pOutPlaneV += pPlaneOut[2].u_stride; 19099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 19109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0; i<3; i++) 19129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 19139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pImagePlanesTemp[i].pac_data != M4OSA_NULL) 19149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 19159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pImagePlanesTemp[i].pac_data); 19169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pImagePlanesTemp[i].pac_data = M4OSA_NULL; 19179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 19189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 19199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 19209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (m_air_context != M4OSA_NULL) { 19229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_cleanUp(m_air_context); 19239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang m_air_context = M4OSA_NULL; 19249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 19259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 19269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 19289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 19299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang//TODO: remove this code after link with videoartist lib 19319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/* M4AIR code*/ 19329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define M4AIR_YUV420_FORMAT_SUPPORTED 19339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define M4AIR_YUV420A_FORMAT_SUPPORTED 19349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/************************* COMPILATION CHECKS ***************************/ 19369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef M4AIR_YUV420_FORMAT_SUPPORTED 19379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef M4AIR_BGR565_FORMAT_SUPPORTED 19389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef M4AIR_RGB565_FORMAT_SUPPORTED 19399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef M4AIR_BGR888_FORMAT_SUPPORTED 19409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef M4AIR_RGB888_FORMAT_SUPPORTED 19419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifndef M4AIR_JPG_FORMAT_SUPPORTED 19429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#error "Please define at least one input format for the AIR component" 19449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 19469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 19479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 19489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 19499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 19509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 19519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/************************ M4AIR INTERNAL TYPES DEFINITIONS ***********************/ 19539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 19559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 19569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * enum M4AIR_States 19579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief The following enumeration defines the internal states of the AIR. 19589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 19599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 19609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changtypedef enum 19619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 19629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_kCreated, /**< State after M4AIR_create has been called */ 19639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_kConfigured /**< State after M4AIR_configure has been called */ 19649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}M4AIR_States; 19659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 19689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 19699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * struct M4AIR_InternalContext 19709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief The following structure is the internal context of the AIR. 19719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 19729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 19739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changtypedef struct 19749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 19759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_States m_state; /**< Internal state */ 19769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_InputFormatType m_inputFormat; /**< Input format like YUV420Planar, RGB565, JPG, etc ... */ 19779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_Params m_params; /**< Current input Parameter of the processing */ 19789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 u32_x_inc[4]; /**< ratio between input and ouput width for YUV */ 19799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 u32_y_inc[4]; /**< ratio between input and ouput height for YUV */ 19809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 u32_x_accum_start[4]; /**< horizontal initial accumulator value */ 19819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 u32_y_accum_start[4]; /**< Vertical initial accumulator value */ 19829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 u32_x_accum[4]; /**< save of horizontal accumulator value */ 19839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 u32_y_accum[4]; /**< save of vertical accumulator value */ 19849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8* pu8_data_in[4]; /**< Save of input plane pointers in case of stripe mode */ 19859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 m_procRows; /**< Number of processed rows, used in stripe mode only */ 19869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Bool m_bOnlyCopy; /**< Flag to know if we just perform a copy or a bilinear interpolation */ 19879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Bool m_bFlipX; /**< Depend on output orientation, used during processing to revert processing order in X coordinates */ 19889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Bool m_bFlipY; /**< Depend on output orientation, used during processing to revert processing order in Y coordinates */ 19899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Bool m_bRevertXY; /**< Depend on output orientation, used during processing to revert X and Y processing order (+-90° rotation) */ 19909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang}M4AIR_InternalContext; 19919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/********************************* MACROS *******************************/ 19939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#define M4ERR_CHECK_NULL_RETURN_VALUE(retval, pointer) if ((pointer) == M4OSA_NULL) return ((M4OSA_ERR)(retval)); 19949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 19969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/********************** M4AIR PUBLIC API IMPLEMENTATION ********************/ 19979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 19989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 19999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_ERR M4AIR_create(M4OSA_Context* pContext,M4AIR_InputFormatType inputFormat) 20009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @author Arnaud Collard 20019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function initialize an instance of the AIR. 20029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pContext: (IN/OUT) Address of the context to create 20039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param inputFormat: (IN) input format type. 20049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4NO_ERROR: there is no error 20059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). Invalid formatType 20069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_ALLOC: No more memory is available 20079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 20089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 20099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4AIR_create(M4OSA_Context* pContext,M4AIR_InputFormatType inputFormat) 20109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 20119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err = M4NO_ERROR ; 20129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_InternalContext* pC = M4OSA_NULL ; 20139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Check that the address on the context is not NULL */ 20149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 20159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pContext = M4OSA_NULL ; 20179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Internal Context creation */ 20199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC = (M4AIR_InternalContext*)M4OSA_32bitAlignedMalloc(sizeof(M4AIR_InternalContext), M4AIR, (M4OSA_Char*)"AIR internal context") ; 20209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_ALLOC, pC) ; 20219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Check if the input format is supported */ 20249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang switch(inputFormat) 20259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 20269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef M4AIR_YUV420_FORMAT_SUPPORTED 20279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4AIR_kYUV420P: 20289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break ; 20299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 20309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef M4AIR_YUV420A_FORMAT_SUPPORTED 20319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4AIR_kYUV420AP: 20329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break ; 20339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 20349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang default: 20359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4ERR_AIR_FORMAT_NOT_SUPPORTED; 20369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang goto M4AIR_create_cleanup ; 20379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 20389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Save input format and update state */ 20409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_inputFormat = inputFormat; 20419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_state = M4AIR_kCreated; 20429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Return the context to the caller */ 20449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pContext = pC ; 20459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR ; 20479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4AIR_create_cleanup: 20499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Error management : we destroy the context if needed */ 20509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_NULL != pC) 20519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 20529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pC) ; 20539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 20549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pContext = M4OSA_NULL ; 20569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err ; 20589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 20599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 20639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 20649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_ERR M4AIR_cleanUp(M4OSA_Context pContext) 20659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @author Arnaud Collard 20669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function destroys an instance of the AIR component 20679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pContext: (IN) Context identifying the instance to destroy 20689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4NO_ERROR: there is no error 20699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). 20709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_STATE: Internal state is incompatible with this function call. 20719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang****************************************************************************** 20729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 20739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4AIR_cleanUp(M4OSA_Context pContext) 20749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 20759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; 20769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 20789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Check state */ 20809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((M4AIR_kCreated != pC->m_state)&&(M4AIR_kConfigured != pC->m_state)) 20819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 20829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_STATE; 20839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 20849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pC) ; 20859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR ; 20879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 20899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 20919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 20929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 20939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_ERR M4AIR_configure(M4OSA_Context pContext, M4AIR_Params* pParams) 20949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function will configure the AIR. 20959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note It will set the input and output coordinates and sizes, 20969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * and indicates if we will proceed in stripe or not. 20979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * In case a M4AIR_get in stripe mode was on going, it will cancel this previous processing 20989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * and reset the get process. 20999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pContext: (IN) Context identifying the instance 21009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pParams->m_bOutputStripe:(IN) Stripe mode. 21019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pParams->m_inputCoord: (IN) X,Y coordinates of the first valid pixel in input. 21029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pParams->m_inputSize: (IN) input ROI size. 21039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pParams->m_outputSize: (IN) output size. 21049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4NO_ERROR: there is no error 21059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_ALLOC: No more memory space to add a new effect. 21069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). 21079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_AIR_FORMAT_NOT_SUPPORTED: the requested input format is not supported. 21089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 21099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 21109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4AIR_configure(M4OSA_Context pContext, M4AIR_Params* pParams) 21119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 21129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; 21139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 i,u32_width_in, u32_width_out, u32_height_in, u32_height_out; 21149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 nb_planes; 21159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 21179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4AIR_kYUV420AP == pC->m_inputFormat) 21199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang nb_planes = 4; 21219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 21239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang nb_planes = 3; 21259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Check state */ 21289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((M4AIR_kCreated != pC->m_state)&&(M4AIR_kConfigured != pC->m_state)) 21299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_STATE; 21319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** Save parameters */ 21349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_params = *pParams; 21359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Check for the input&output width and height are even */ 21379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( ((pC->m_params.m_inputSize.m_height)&0x1) || 21389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((pC->m_params.m_inputSize.m_height)&0x1)) 21399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_AIR_ILLEGAL_FRAME_SIZE; 21419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( ((pC->m_params.m_inputSize.m_width)&0x1) || 21449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((pC->m_params.m_inputSize.m_width)&0x1)) 21459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_AIR_ILLEGAL_FRAME_SIZE; 21479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(((pC->m_params.m_inputSize.m_width) == (pC->m_params.m_outputSize.m_width)) 21499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang &&((pC->m_params.m_inputSize.m_height) == (pC->m_params.m_outputSize.m_height))) 21509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< No resize in this case, we will just copy input in output */ 21529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bOnlyCopy = M4OSA_TRUE; 21539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 21559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bOnlyCopy = M4OSA_FALSE; 21579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Initialize internal variables used for resize filter */ 21599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<nb_planes;i++) 21609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width_in = ((i==0)||(i==3))?pC->m_params.m_inputSize.m_width:(pC->m_params.m_inputSize.m_width+1)>>1; 21639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height_in = ((i==0)||(i==3))?pC->m_params.m_inputSize.m_height:(pC->m_params.m_inputSize.m_height+1)>>1; 21649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_width_out = ((i==0)||(i==3))?pC->m_params.m_outputSize.m_width:(pC->m_params.m_outputSize.m_width+1)>>1; 21659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_height_out = ((i==0)||(i==3))?pC->m_params.m_outputSize.m_height:(pC->m_params.m_outputSize.m_height+1)>>1; 21669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Compute horizontal ratio between src and destination width.*/ 21689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_width_out >= u32_width_in) 21699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_inc[i] = ((u32_width_in-1) * 0x10000) / (u32_width_out-1); 21719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 21739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_inc[i] = (u32_width_in * 0x10000) / (u32_width_out); 21759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Compute vertical ratio between src and destination height.*/ 21789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_height_out >= u32_height_in) 21799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_inc[i] = ((u32_height_in - 1) * 0x10000) / (u32_height_out-1); 21819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 21839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_inc[i] = (u32_height_in * 0x10000) / (u32_height_out); 21859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 21869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 21889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Calculate initial accumulator value : u32_y_accum_start. 21899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum_start is coded on 15 bits, and represents a value between 0 and 0.5 21909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 21919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (pC->u32_y_inc[i] >= 0x10000) 21929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 21939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 21949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Keep the fractionnal part, assimung that integer part is coded 21959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang on the 16 high bits and the fractionnal on the 15 low bits 21969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 21979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum_start[i] = pC->u32_y_inc[i] & 0xffff; 21989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 21999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (!pC->u32_y_accum_start[i]) 22009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum_start[i] = 0x10000; 22029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum_start[i] >>= 1; 22059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 22079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum_start[i] = 0; 22099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Take into account that Y coordinate can be odd 22119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang in this case we have to put a 0.5 offset 22129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for U and V plane as there a 2 times sub-sampled vs Y*/ 22139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((pC->m_params.m_inputCoord.m_y&0x1)&&((i==1)||(i==2))) 22149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum_start[i] += 0x8000; 22169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* 22199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang Calculate initial accumulator value : u32_x_accum_start. 22209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum_start is coded on 15 bits, and represents a value between 0 and 0.5 22219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */ 22229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (pC->u32_x_inc[i] >= 0x10000) 22249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum_start[i] = pC->u32_x_inc[i] & 0xffff; 22269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (!pC->u32_x_accum_start[i]) 22289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum_start[i] = 0x10000; 22309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum_start[i] >>= 1; 22339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 22359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum_start[i] = 0; 22379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Take into account that X coordinate can be odd 22399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang in this case we have to put a 0.5 offset 22409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for U and V plane as there a 2 times sub-sampled vs Y*/ 22419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((pC->m_params.m_inputCoord.m_x&0x1)&&((i==1)||(i==2))) 22429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum_start[i] += 0x8000; 22449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Reset variable used for stripe mode */ 22499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_procRows = 0; 22509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Initialize var for X/Y processing order according to orientation */ 22529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipX = M4OSA_FALSE; 22539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipY = M4OSA_FALSE; 22549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bRevertXY = M4OSA_FALSE; 22559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang switch(pParams->m_outputOrientation) 22569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 22579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationTopLeft: 22589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationTopRight: 22609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipX = M4OSA_TRUE; 22619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationBottomRight: 22639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipX = M4OSA_TRUE; 22649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipY = M4OSA_TRUE; 22659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationBottomLeft: 22679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipY = M4OSA_TRUE; 22689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationLeftTop: 22709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bRevertXY = M4OSA_TRUE; 22719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationRightTop: 22739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bRevertXY = M4OSA_TRUE; 22749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipY = M4OSA_TRUE; 22759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationRightBottom: 22779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bRevertXY = M4OSA_TRUE; 22789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipX = M4OSA_TRUE; 22799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipY = M4OSA_TRUE; 22809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang case M4COMMON_kOrientationLeftBottom: 22829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bRevertXY = M4OSA_TRUE; 22839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_bFlipX = M4OSA_TRUE; 22849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 22859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang default: 22869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_PARAMETER; 22879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 22889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Update state */ 22899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_state = M4AIR_kConfigured; 22909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR ; 22929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 22939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 22959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 22969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 22979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_ERR M4AIR_get(M4OSA_Context pContext, M4VIFI_ImagePlane* pIn, M4VIFI_ImagePlane* pOut) 22989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function will provide the requested resized area of interest according to settings 22999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * provided in M4AIR_configure. 23009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @note In case the input format type is JPEG, input plane(s) 23019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * in pIn is not used. In normal mode, dimension specified in output plane(s) structure must be the 23029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * same than the one specified in M4AIR_configure. In stripe mode, only the width will be the same, 23039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * height will be taken as the stripe height (typically 16). 23049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * In normal mode, this function is call once to get the full output picture. In stripe mode, it is called 23059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * for each stripe till the whole picture has been retrieved,and the position of the output stripe in the output picture 23069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * is internally incremented at each step. 23079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Any call to M4AIR_configure during stripe process will reset this one to the beginning of the output picture. 23089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pContext: (IN) Context identifying the instance 23099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pIn: (IN) Plane structure containing input Plane(s). 23109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param pOut: (IN/OUT) Plane structure containing output Plane(s). 23119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4NO_ERROR: there is no error 23129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_ALLOC: No more memory space to add a new effect. 23139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). 23149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 23159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 23169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR M4AIR_get(M4OSA_Context pContext, M4VIFI_ImagePlane* pIn, M4VIFI_ImagePlane* pOut) 23179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang{ 23189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; 23199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 i,j,k,u32_x_frac,u32_y_frac,u32_x_accum,u32_y_accum,u32_shift; 23209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8 *pu8_data_in, *pu8_data_in_org, *pu8_data_in_tmp, *pu8_data_out; 23219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8 *pu8_src_top; 23229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8 *pu8_src_bottom; 23239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 u32_temp_value; 23249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Int32 i32_tmp_offset; 23259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 nb_planes; 23269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 23309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Check state */ 23329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4AIR_kConfigured != pC->m_state) 23339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_STATE; 23359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4AIR_kYUV420AP == pC->m_inputFormat) 23389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang nb_planes = 4; 23409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 23429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang nb_planes = 3; 23449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each Plane */ 23479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<nb_planes;i++) 23489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Set the working pointers at the beginning of the input/output data field */ 23519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_shift = ((i==0)||(i==3))?0:1; /**< Depend on Luma or Chroma */ 23539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((M4OSA_FALSE == pC->m_params.m_bOutputStripe)||((M4OSA_TRUE == pC->m_params.m_bOutputStripe)&&(0 == pC->m_procRows))) 23559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< For input, take care about ROI */ 23579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pIn[i].pac_data + pIn[i].u_topleft + (pC->m_params.m_inputCoord.m_x>>u32_shift) 23589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang + (pC->m_params.m_inputCoord.m_y >> u32_shift) * pIn[i].u_stride; 23599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** Go at end of line/column in case X/Y scanning is flipped */ 23619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_TRUE == pC->m_bFlipX) 23629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in += ((pC->m_params.m_inputSize.m_width)>>u32_shift) -1 ; 23649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_TRUE == pC->m_bFlipY) 23669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in += ((pC->m_params.m_inputSize.m_height>>u32_shift) -1) * pIn[i].u_stride; 23689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Initialize accumulators in case we are using it (bilinear interpolation) */ 23719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( M4OSA_FALSE == pC->m_bOnlyCopy) 23729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum[i] = pC->u32_x_accum_start[i]; 23749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum[i] = pC->u32_y_accum_start[i]; 23759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 23799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< In case of stripe mode for other than first stripe, we need to recover input pointer from internal context */ 23819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pC->pu8_data_in[i]; 23829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< In every mode, output data are at the beginning of the output plane */ 23859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out = pOut[i].pac_data + pOut[i].u_topleft; 23869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Initialize input offset applied after each pixel */ 23889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bFlipY) 23899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_tmp_offset = pIn[i].u_stride; 23919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 23939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 23949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang i32_tmp_offset = -pIn[i].u_stride; 23959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 23969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 23979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< In this case, no bilinear interpolation is needed as input and output dimensions are the same */ 23989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if( M4OSA_TRUE == pC->m_bOnlyCopy) 23999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< No +-90° rotation */ 24019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bRevertXY) 24029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< No flip on X abscissa */ 24049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bFlipX) 24059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 loc_height = pOut[i].u_height; 24079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 loc_width = pOut[i].u_width; 24089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 loc_stride = pIn[i].u_stride; 24099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each row */ 24109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (j=0; j<loc_height; j++) 24119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Copy one whole line */ 24139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang memcpy((void *)pu8_data_out, (void *)pu8_data_in, loc_width); 24149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Update pointers */ 24169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out += pOut[i].u_stride; 24179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bFlipY) 24189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in += loc_stride; 24209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 24229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in -= loc_stride; 24249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 24289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each row */ 24309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(j=0;j<pOut[i].u_height;j++) 24319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each pixel of 1 row */ 24339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 24349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = *pu8_data_in--; 24369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Update pointers */ 24399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out += (pOut[i].u_stride - pOut[i].u_width); 24409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in += pOut[i].u_width + i32_tmp_offset; 24429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Here we have a +-90° rotation */ 24479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 24489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each row */ 24519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(j=0;j<pOut[i].u_height;j++) 24529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in_tmp = pu8_data_in; 24549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each pixel of 1 row */ 24569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 24579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = *pu8_data_in_tmp; 24599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Update input pointer in order to go to next/past line */ 24619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in_tmp += i32_tmp_offset; 24629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Update pointers */ 24659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out += (pOut[i].u_stride - pOut[i].u_width); 24669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bFlipX) 24679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in ++; 24699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 24719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in --; 24739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 24779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Bilinear interpolation */ 24789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 24799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(3 != i) /**< other than alpha plane */ 24829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**No +-90° rotation */ 24849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bRevertXY) 24859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each row */ 24889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(j=0;j<pOut[i].u_height;j++) 24899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 24909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Vertical weight factor */ 24919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_frac = (pC->u32_y_accum[i]>>12)&15; 24929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Reinit horizontal weight factor */ 24949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum = pC->u32_x_accum_start[i]; 24959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 24989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_TRUE == pC->m_bFlipX) 24999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 25029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 25039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal weight factor */ 25069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = (pu8_data_in - (u32_x_accum >> 16)) -1 ; 25089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 25109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 25129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 25139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 25149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[1]*(16-u32_x_frac) + 25159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 25169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 25189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update horizontal accumulator */ 25209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum += pC->u32_x_inc[i]; 25219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 25229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 25239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 25259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 25279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 25289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal weight factor */ 25309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = pu8_data_in + (u32_x_accum >> 16); 25329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 25349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 25369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 25379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 25389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[0]*(16-u32_x_frac) + 25399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 25409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 25429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update horizontal accumulator */ 25449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum += pC->u32_x_inc[i]; 25459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 25469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 25489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 25509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update vertical accumulator */ 25529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum[i] += pC->u32_y_inc[i]; 25539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (pC->u32_y_accum[i]>>16) 25549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in + (pC->u32_y_accum[i] >> 16) * i32_tmp_offset; 25569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum[i] &= 0xffff; 25579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 25589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 25599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 25609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** +-90° rotation */ 25619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 25629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in_org = pu8_data_in; 25649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output row */ 25669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(j=0;j<pOut[i].u_height;j++) 25679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* horizontal weight factor */ 25699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_frac = (pC->u32_x_accum[i]>>12)&15; 25709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Reinit accumulator */ 25729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum = pC->u32_y_accum_start[i]; 25739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_TRUE == pC->m_bFlipX) 25759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 25789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 25799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 25809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 25829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = (pu8_data_in - (pC->u32_x_accum[i] >> 16)) - 1; 25859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 25879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 25899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 25909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 25919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[1]*(16-u32_x_frac) + 25929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 25939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 25959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 25969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update vertical accumulator */ 25979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum += pC->u32_y_inc[i]; 25989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_y_accum>>16) 25999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 26019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum &= 0xffff; 26029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 26079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 26099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 26109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 26139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = pu8_data_in + (pC->u32_x_accum[i] >> 16); 26159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 26179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 26199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 26209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 26219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[0]*(16-u32_x_frac) + 26229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 26239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 26259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update vertical accumulator */ 26279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum += pC->u32_y_inc[i]; 26289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_y_accum>>16) 26299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 26319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum &= 0xffff; 26329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 26369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update horizontal accumulator */ 26389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum[i] += pC->u32_x_inc[i]; 26399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in_org; 26419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang }/** 3 != i */ 26459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 26469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**No +-90° rotation */ 26489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bRevertXY) 26499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each row */ 26529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(j=0;j<pOut[i].u_height;j++) 26539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Vertical weight factor */ 26559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_frac = (pC->u32_y_accum[i]>>12)&15; 26569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Reinit horizontal weight factor */ 26589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum = pC->u32_x_accum_start[i]; 26599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_TRUE == pC->m_bFlipX) 26639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 26669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 26679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal weight factor */ 26709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = (pu8_data_in - (u32_x_accum >> 16)) -1 ; 26729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 26749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 26769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 26779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 26789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[1]*(16-u32_x_frac) + 26799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 26809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value= (u32_temp_value >> 7)*0xff; 26829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 26849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update horizontal accumulator */ 26869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum += pC->u32_x_inc[i]; 26879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 26899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 26919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 26939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 26949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 26959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal weight factor */ 26969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = pu8_data_in + (u32_x_accum >> 16); 26989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 26999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 27009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 27029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 27039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 27049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[0]*(16-u32_x_frac) + 27059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 27069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value= (u32_temp_value >> 7)*0xff; 27089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 27109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update horizontal accumulator */ 27129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_accum += pC->u32_x_inc[i]; 27139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 27149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 27169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 27189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update vertical accumulator */ 27209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum[i] += pC->u32_y_inc[i]; 27219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (pC->u32_y_accum[i]>>16) 27229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in + (pC->u32_y_accum[i] >> 16) * i32_tmp_offset; 27249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_y_accum[i] &= 0xffff; 27259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 27269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 27279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } /**< M4OSA_FALSE == pC->m_bRevertXY */ 27299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** +-90° rotation */ 27309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 27319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in_org = pu8_data_in; 27339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output row */ 27359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(j=0;j<pOut[i].u_height;j++) 27369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* horizontal weight factor */ 27389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_x_frac = (pC->u32_x_accum[i]>>12)&15; 27399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Reinit accumulator */ 27419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum = pC->u32_y_accum_start[i]; 27429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_TRUE == pC->m_bFlipX) 27449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 27479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 27489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 27519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = (pu8_data_in - (pC->u32_x_accum[i] >> 16)) - 1; 27549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 27569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 27589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 27599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 27609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[1]*(16-u32_x_frac) + 27619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 27629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value= (u32_temp_value >> 7)*0xff; 27649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 27669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update vertical accumulator */ 27689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum += pC->u32_y_inc[i]; 27699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_y_accum>>16) 27709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 27729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum &= 0xffff; 27739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 27749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 27769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 27779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 27789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Loop on each output pixel in a row */ 27809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(k=0;k<pOut[i].u_width;k++) 27819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 27829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 27849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top = pu8_data_in + (pC->u32_x_accum[i] >> 16); 27869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom = pu8_src_top + i32_tmp_offset; 27889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Weighted combination */ 27909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 27919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 27929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (pu8_src_bottom[0]*(16-u32_x_frac) + 27939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 27949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_temp_value= (u32_temp_value >> 7)*0xff; 27969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 27989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 27999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update vertical accumulator */ 28009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum += pC->u32_y_inc[i]; 28019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if (u32_y_accum>>16) 28029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 28039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 28049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang u32_y_accum &= 0xffff; 28059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 28099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* Update horizontal accumulator */ 28119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->u32_x_accum[i] += pC->u32_x_inc[i]; 28129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pu8_data_in = pu8_data_in_org; 28149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } /**< M4OSA_TRUE == pC->m_bRevertXY */ 28179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang }/** 3 == i */ 28189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< In case of stripe mode, save current input pointer */ 28209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_TRUE == pC->m_params.m_bOutputStripe) 28219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 28229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->pu8_data_in[i] = pu8_data_in; 28239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /**< Update number of processed rows, reset it if we have finished with the whole processing */ 28279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang pC->m_procRows += pOut[0].u_height; 28289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_FALSE == pC->m_bRevertXY) 28299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 28309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pC->m_params.m_outputSize.m_height <= pC->m_procRows) pC->m_procRows = 0; 28319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 28339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 28349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pC->m_params.m_outputSize.m_width <= pC->m_procRows) pC->m_procRows = 0; 28359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR ; 28389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 28409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*+ Handle the image files here */ 28419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/** 28439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 28449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * M4OSA_ERR LvGetImageThumbNail(M4OSA_UChar *fileName, M4OSA_Void **pBuffer) 28459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @brief This function gives YUV420 buffer of a given image file (in argb888 format) 28469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @Note: The caller of the function is responsible to free the yuv buffer allocated 28479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param fileName: (IN) Path to the filename of the image argb data 28489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param height: (IN) Height of the image 28499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @param width: (OUT) pBuffer pointer to the address where the yuv data address needs to be returned. 28509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4NO_ERROR: there is no error 28519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_ALLOC: No more memory space to add a new effect. 28529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * @return M4ERR_FILE_NOT_FOUND: if the file passed does not exists. 28539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ****************************************************************************** 28549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang*/ 28559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR LvGetImageThumbNail(const char *fileName, M4OSA_UInt32 height, M4OSA_UInt32 width, M4OSA_Void **pBuffer) { 28569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane rgbPlane, *yuvPlane; 28589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 frameSize_argb = (width * height * 4); // argb data 28599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Context lImageFileFp = M4OSA_NULL; 28609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 28619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt8 *pTmpData = (M4OSA_UInt8*) M4OSA_32bitAlignedMalloc(frameSize_argb, M4VS, (M4OSA_Char*)"Image argb data"); 28639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(pTmpData == M4OSA_NULL) { 2864f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Failed to allocate memory for Image clip"); 28659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 28669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** Read the argb data from the passed file. */ 28699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR lerr = M4OSA_fileReadOpen(&lImageFileFp, (M4OSA_Void *) fileName, M4OSA_kFileRead); 28709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((lerr != M4NO_ERROR) || (lImageFileFp == M4OSA_NULL)) 28729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 2873f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("LVPreviewController: Can not open the file "); 28749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pTmpData); 28759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_FILE_NOT_FOUND; 28769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang lerr = M4OSA_fileReadData(lImageFileFp, (M4OSA_MemAddr8)pTmpData, &frameSize_argb); 28789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(lerr != M4NO_ERROR) 28799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 2880f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("LVPreviewController: can not read the data "); 28819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_fileReadClose(lImageFileFp); 28829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pTmpData); 28839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return lerr; 28849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_fileReadClose(lImageFileFp); 28869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 frameSize = (width * height * 3); //Size of YUV420 data. 28889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang rgbPlane.pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize, M4VS, (M4OSA_Char*)"Image clip RGB888 data"); 28899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(rgbPlane.pac_data == M4OSA_NULL) 28909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 2891f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Failed to allocate memory for Image clip"); 28929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pTmpData); 28939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 28949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 28959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 28969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** Remove the alpha channel */ 28979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for (M4OSA_UInt32 i=0, j = 0; i < frameSize_argb; i++) { 28989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if ((i % 4) == 0) continue; 28999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang rgbPlane.pac_data[j] = pTmpData[i]; 29009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang j++; 29019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 29029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(pTmpData); 29039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef FILE_DUMP 29059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FILE *fp = fopen("/sdcard/Input/test_rgb.raw", "wb"); 29069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(fp == NULL) 2907f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Errors file can not be created"); 29089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else { 29099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fwrite(rgbPlane.pac_data, frameSize, 1, fp); 29109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fclose(fp); 29119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 29129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 29139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang rgbPlane.u_height = height; 29149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang rgbPlane.u_width = width; 29159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang rgbPlane.u_stride = width*3; 29169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang rgbPlane.u_topleft = 0; 29179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc(3*sizeof(M4VIFI_ImagePlane), 29199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VS, (M4OSA_Char*)"M4xVSS_internalConvertRGBtoYUV: Output plane YUV"); 29209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[0].u_height = height; 29219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[0].u_width = width; 29229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[0].u_stride = width; 29239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[0].u_topleft = 0; 29249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[0].pac_data = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(yuvPlane[0].u_height * yuvPlane[0].u_width * 1.5, M4VS, (M4OSA_Char*)"imageClip YUV data"); 29259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[1].u_height = yuvPlane[0].u_height >>1; 29279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[1].u_width = yuvPlane[0].u_width >> 1; 29289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[1].u_stride = yuvPlane[1].u_width; 29299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[1].u_topleft = 0; 29309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[1].pac_data = (M4VIFI_UInt8*)(yuvPlane[0].pac_data + yuvPlane[0].u_height * yuvPlane[0].u_width); 29319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[2].u_height = yuvPlane[0].u_height >>1; 29339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[2].u_width = yuvPlane[0].u_width >> 1; 29349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[2].u_stride = yuvPlane[2].u_width; 29359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[2].u_topleft = 0; 29369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang yuvPlane[2].pac_data = (M4VIFI_UInt8*)(yuvPlane[1].pac_data + yuvPlane[1].u_height * yuvPlane[1].u_width); 29379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VIFI_RGB888toYUV420(M4OSA_NULL, &rgbPlane, yuvPlane); 29409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang //err = M4VIFI_BGR888toYUV420(M4OSA_NULL, &rgbPlane, yuvPlane); 29419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) 29429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 2943f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("error when converting from RGB to YUV: 0x%x\n", (unsigned int)err); 29449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 29459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(rgbPlane.pac_data); 29469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 2947f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block //ALOGE("RGB to YUV done"); 29489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#ifdef FILE_DUMP 29499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang FILE *fp1 = fopen("/sdcard/Input/test_yuv.raw", "wb"); 29509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(fp1 == NULL) 2951f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Errors file can not be created"); 29529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else { 29539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fwrite(yuvPlane[0].pac_data, yuvPlane[0].u_height * yuvPlane[0].u_width * 1.5, 1, fp1); 29549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fclose(fp1); 29559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 29569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#endif 29579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *pBuffer = yuvPlane[0].pac_data; 29589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(yuvPlane); 29599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR; 29609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 29629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void prepareYUV420ImagePlane(M4VIFI_ImagePlane *plane, 29639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 width, M4OSA_UInt32 height, M4VIFI_UInt8 *buffer, 29649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 reportedWidth, M4OSA_UInt32 reportedHeight) { 29659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang //Y plane 29679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_width = width; 29689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_height = height; 29699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_stride = reportedWidth; 29709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_topleft = 0; 29719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].pac_data = buffer; 29729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // U plane 29749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_width = width/2; 29759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_height = height/2; 29769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_stride = reportedWidth >> 1; 29779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_topleft = 0; 29789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].pac_data = buffer+(reportedWidth*reportedHeight); 29799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // V Plane 29819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_width = width/2; 29829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_height = height/2; 29839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_stride = reportedWidth >> 1; 29849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_topleft = 0; 29859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].pac_data = plane[1].pac_data + ((reportedWidth/2)*(reportedHeight/2)); 29869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 29879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void prepareYV12ImagePlane(M4VIFI_ImagePlane *plane, 29899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 width, M4OSA_UInt32 height, M4OSA_UInt32 stride, 29909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *buffer) { 29919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang //Y plane 29939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_width = width; 29949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_height = height; 29959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_stride = stride; 29969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_topleft = 0; 29979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].pac_data = buffer; 29989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 29999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // U plane 30009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_width = width/2; 30019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_height = height/2; 30029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_stride = android::PreviewRenderer::ALIGN(plane[0].u_stride/2, 16); 30039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].u_topleft = 0; 30049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[1].pac_data = (buffer 30059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang + plane[0].u_height * plane[0].u_stride 30069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang + (plane[0].u_height/2) * android::PreviewRenderer::ALIGN(( 30079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_stride / 2), 16)); 30089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // V Plane 30109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_width = width/2; 30119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_height = height/2; 30129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_stride = android::PreviewRenderer::ALIGN(plane[0].u_stride/2, 16); 30139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].u_topleft = 0; 30149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[2].pac_data = (buffer + 30159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang plane[0].u_height * android::PreviewRenderer::ALIGN(plane[0].u_stride, 16)); 30169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 30199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void swapImagePlanes( 30219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *planeIn, M4VIFI_ImagePlane *planeOut, 30229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *buffer1, M4VIFI_UInt8 *buffer2) { 30239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[0].u_height = planeOut[0].u_height; 30259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[0].u_width = planeOut[0].u_width; 30269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[0].u_stride = planeOut[0].u_stride; 30279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[0].u_topleft = planeOut[0].u_topleft; 30289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[0].pac_data = planeOut[0].pac_data; 30299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 30319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * U plane */ 30329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[1].u_width = planeOut[1].u_width; 30339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[1].u_height = planeOut[1].u_height; 30349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[1].u_stride = planeOut[1].u_stride; 30359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[1].u_topleft = planeOut[1].u_topleft; 30369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[1].pac_data = planeOut[1].pac_data; 30379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /** 30389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * V Plane */ 30399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[2].u_width = planeOut[2].u_width; 30409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[2].u_height = planeOut[2].u_height; 30419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[2].u_stride = planeOut[2].u_stride; 30429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[2].u_topleft = planeOut[2].u_topleft; 30439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn[2].pac_data = planeOut[2].pac_data; 30449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(planeOut[0].pac_data == (M4VIFI_UInt8*)buffer1) 30469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 30479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[0].pac_data = (M4VIFI_UInt8*)buffer2; 30489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[1].pac_data = (M4VIFI_UInt8*)(buffer2 + 30499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[0].u_width*planeOut[0].u_height); 30509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[2].pac_data = (M4VIFI_UInt8*)(buffer2 + 30529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[0].u_width*planeOut[0].u_height + 30539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[1].u_width*planeOut[1].u_height); 30549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 30559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else 30569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 30579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[0].pac_data = (M4VIFI_UInt8*)buffer1; 30589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[1].pac_data = (M4VIFI_UInt8*)(buffer1 + 30599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[0].u_width*planeOut[0].u_height); 30609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[2].pac_data = (M4VIFI_UInt8*)(buffer1 + 30629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[0].u_width*planeOut[0].u_height + 30639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeOut[1].u_width*planeOut[1].u_height); 30649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 30659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 30679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void computePercentageDone( 30699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 ctsMs, M4OSA_UInt32 effectStartTimeMs, 30709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 effectDuration, M4OSA_Double *percentageDone) { 30719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Double videoEffectTime =0; 30739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Compute how far from the beginning of the effect we are, in clip-base time. 30759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang videoEffectTime = 30769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_Int32)(ctsMs+ 0.5) - effectStartTimeMs; 30779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // To calculate %, substract timeIncrement 30799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // because effect should finish on the last frame 30809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // which is from CTS = (eof-timeIncrement) till CTS = eof 30819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *percentageDone = 30829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang videoEffectTime / ((M4OSA_Float)effectDuration); 30839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(*percentageDone < 0.0) *percentageDone = 0.0; 30859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(*percentageDone > 1.0) *percentageDone = 1.0; 30869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 30889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_Void computeProgressForVideoEffect( 30919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 ctsMs, M4OSA_UInt32 effectStartTimeMs, 30929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 effectDuration, M4VSS3GPP_ExternalProgress* extProgress) { 30939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Double percentageDone =0; 30959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang computePercentageDone(ctsMs, effectStartTimeMs, effectDuration, &percentageDone); 30979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 30989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang extProgress->uiProgress = (M4OSA_UInt32)( percentageDone * 1000 ); 30999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang extProgress->uiOutputTime = (M4OSA_UInt32)(ctsMs + 0.5); 31009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang extProgress->uiClipTime = extProgress->uiOutputTime; 31019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang extProgress->bIsLast = M4OSA_FALSE; 31029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 31039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR prepareFramingStructure( 31059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_FramingStruct* framingCtx, 31069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VSS3GPP_EffectSettings* effectsSettings, M4OSA_UInt32 index, 31079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8* overlayRGB, M4VIFI_UInt8* overlayYUV) { 31089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 31109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Force input RGB buffer to even size to avoid errors in YUV conversion 31129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingRgb = effectsSettings[index].xVSS.pFramingBuffer; 31139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingRgb->u_width = framingCtx->FramingRgb->u_width & ~1; 31149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingRgb->u_height = framingCtx->FramingRgb->u_height & ~1; 31159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv = NULL; 31169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->duration = effectsSettings[index].uiDuration; 31189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->topleft_x = effectsSettings[index].xVSS.topleft_x; 31199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->topleft_y = effectsSettings[index].xVSS.topleft_y; 31209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->pCurrent = framingCtx; 31219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->pNext = framingCtx; 31229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->previousClipTime = -1; 31239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->alphaBlendingStruct = 31259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4xVSS_internalEffectsAlphaBlending*)M4OSA_32bitAlignedMalloc( 31269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang sizeof(M4xVSS_internalEffectsAlphaBlending), M4VS, 31279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_Char*)"alpha blending struct"); 31289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->alphaBlendingStruct->m_fadeInTime = 31309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang effectsSettings[index].xVSS.uialphaBlendingFadeInTime; 31319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->alphaBlendingStruct->m_fadeOutTime = 31339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang effectsSettings[index].xVSS.uialphaBlendingFadeOutTime; 31349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->alphaBlendingStruct->m_end = 31369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang effectsSettings[index].xVSS.uialphaBlendingEnd; 31379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->alphaBlendingStruct->m_middle = 31399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang effectsSettings[index].xVSS.uialphaBlendingMiddle; 31409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->alphaBlendingStruct->m_start = 31429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang effectsSettings[index].xVSS.uialphaBlendingStart; 31439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // If new Overlay buffer, convert from RGB to YUV 31459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((overlayRGB != framingCtx->FramingRgb->pac_data) || (overlayYUV == NULL) ) { 31469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // If YUV buffer exists, delete it 31489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(overlayYUV != NULL) { 31499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(overlayYUV); 31509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang overlayYUV = NULL; 31519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 31529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(effectsSettings[index].xVSS.rgbType == M4VSS3GPP_kRGB565) { 31539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Input RGB565 plane is provided, 31549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // let's convert it to YUV420, and update framing structure 31559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4xVSS_internalConvertRGBtoYUV(framingCtx); 31569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 31579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else if(effectsSettings[index].xVSS.rgbType == M4VSS3GPP_kRGB888) { 31589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Input RGB888 plane is provided, 31599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // let's convert it to YUV420, and update framing structure 31609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4xVSS_internalConvertRGB888toYUV(framingCtx); 31619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 31629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else { 31639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4ERR_PARAMETER; 31649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 31659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang overlayYUV = framingCtx->FramingYuv[0].pac_data; 31669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang overlayRGB = framingCtx->FramingRgb->pac_data; 31679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 31699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang else { 31702703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV(" YUV buffer reuse"); 31719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv = (M4VIFI_ImagePlane*)M4OSA_32bitAlignedMalloc( 31729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 3*sizeof(M4VIFI_ImagePlane), M4VS, (M4OSA_Char*)"YUV"); 31739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(framingCtx->FramingYuv == M4OSA_NULL) { 31759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 31769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 31779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_width = framingCtx->FramingRgb->u_width; 31799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_height = framingCtx->FramingRgb->u_height; 31809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_topleft = 0; 31819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_stride = framingCtx->FramingRgb->u_width; 31829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].pac_data = (M4VIFI_UInt8*)overlayYUV; 31839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_width = (framingCtx->FramingRgb->u_width)>>1; 31859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_height = (framingCtx->FramingRgb->u_height)>>1; 31869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_topleft = 0; 31879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_stride = (framingCtx->FramingRgb->u_width)>>1; 31889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].pac_data = framingCtx->FramingYuv[0].pac_data + 31899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[0].u_width * framingCtx->FramingYuv[0].u_height; 31909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_width = (framingCtx->FramingRgb->u_width)>>1; 31929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_height = (framingCtx->FramingRgb->u_height)>>1; 31939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_topleft = 0; 31949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].u_stride = (framingCtx->FramingRgb->u_width)>>1; 31959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[2].pac_data = framingCtx->FramingYuv[1].pac_data + 31969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->FramingYuv[1].u_width * framingCtx->FramingYuv[1].u_height; 31979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 31989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->duration = 0; 31999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->previousClipTime = -1; 32009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx->previewOffsetClipTime = -1; 32019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 32049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 32059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyColorEffect(M4xVSS_VideoEffectType colorEffect, 32079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *planeIn, M4VIFI_ImagePlane *planeOut, 32089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *buffer1, M4VIFI_UInt8 *buffer2, M4OSA_UInt16 rgbColorData) { 32099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_ColorStruct colorContext; 32119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 32129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang colorContext.colorEffectType = colorEffect; 32149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang colorContext.rgb16ColorData = rgbColorData; 32159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VSS3GPP_externalVideoEffectColor( 32179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_Void *)&colorContext, planeIn, planeOut, NULL, 32189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang colorEffect); 32199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 32212703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("M4VSS3GPP_externalVideoEffectColor(%d) error %d", 32229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang colorEffect, err); 32239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != buffer1) { 32259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(buffer1); 32269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang buffer1 = NULL; 32279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != buffer2) { 32299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(buffer2); 32309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang buffer2 = NULL; 32319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 32339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // The out plane now becomes the in plane for adding other effects 32369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang swapImagePlanes(planeIn, planeOut, buffer1, buffer2); 32379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 32399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 32409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyLumaEffect(M4VSS3GPP_VideoEffectType videoEffect, 32429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane *planeIn, M4VIFI_ImagePlane *planeOut, 32439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *buffer1, M4VIFI_UInt8 *buffer2, M4OSA_Int32 lum_factor) { 32449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 32469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VFL_modifyLumaWithScale( 32489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4ViComImagePlane*)planeIn,(M4ViComImagePlane*)planeOut, 32499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang lum_factor, NULL); 32509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 3252f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("M4VFL_modifyLumaWithScale(%d) error %d", videoEffect, (int)err); 32539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != buffer1) { 32559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(buffer1); 32569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang buffer1= NULL; 32579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != buffer2) { 32599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(buffer2); 32609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang buffer2= NULL; 32619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 32639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // The out plane now becomes the in plane for adding other effects 32669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang swapImagePlanes(planeIn, planeOut,(M4VIFI_UInt8 *)buffer1, 32679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)buffer2); 32689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 32709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 32719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung ChangM4OSA_ERR applyEffectsAndRenderingMode(vePostProcessParams *params, 32739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 reportedWidth, M4OSA_UInt32 reportedHeight) { 32749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_ERR err = M4NO_ERROR; 32769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_ImagePlane planeIn[3], planeOut[3]; 32779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VIFI_UInt8 *finalOutputBuffer = NULL, *tempOutputBuffer= NULL; 32789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Double percentageDone =0; 32799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_Int32 lum_factor; 32809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VSS3GPP_ExternalProgress extProgress; 32819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_FiftiesStruct fiftiesCtx; 32829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 frameSize = 0, i=0; 32839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang frameSize = (params->videoWidth*params->videoHeight*3) >> 1; 32859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang finalOutputBuffer = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc(frameSize, M4VS, 32879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_Char*)("lvpp finalOutputBuffer")); 32889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(finalOutputBuffer == NULL) { 3290f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("applyEffectsAndRenderingMode: malloc error"); 32919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 32929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 32939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // allocate the tempOutputBuffer 32959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang tempOutputBuffer = (M4VIFI_UInt8*)M4OSA_32bitAlignedMalloc( 32969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((params->videoHeight*params->videoWidth*3)>>1), M4VS, (M4OSA_Char*)("lvpp colorBuffer")); 32979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 32989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(tempOutputBuffer == NULL) { 3299f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("applyEffectsAndRenderingMode: malloc error tempOutputBuffer"); 33009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != finalOutputBuffer) { 33019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(finalOutputBuffer); 33029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang finalOutputBuffer = NULL; 33039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4ERR_ALLOC; 33059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Initialize the In plane 33089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang prepareYUV420ImagePlane(planeIn, params->videoWidth, params->videoHeight, 33099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->vidBuffer, reportedWidth, reportedHeight); 33109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Initialize the Out plane 33129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang prepareYUV420ImagePlane(planeOut, params->videoWidth, params->videoHeight, 33139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, params->videoWidth, params->videoHeight); 33149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // The planeIn contains the YUV420 input data to postprocessing node 33169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // and planeOut will contain the YUV420 data with effect 33179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // In each successive if condition, apply filter to successive 33189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // output YUV frame so that concurrent effects are both applied 33199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_BLACKANDWHITE) { 33219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyColorEffect(M4xVSS_kVideoEffectType_BlackAndWhite, 33229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 33239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, 0); 33249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 33259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 33269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_PINK) { 33309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyColorEffect(M4xVSS_kVideoEffectType_Pink, 33319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 33329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, 0); 33339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 33349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 33359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_GREEN) { 33399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyColorEffect(M4xVSS_kVideoEffectType_Green, 33409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 33419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, 0); 33429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 33439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 33449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_SEPIA) { 33489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyColorEffect(M4xVSS_kVideoEffectType_Sepia, 33499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 33509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, 0); 33519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 33529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 33539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_NEGATIVE) { 33579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyColorEffect(M4xVSS_kVideoEffectType_Negative, 33589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 33599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, 0); 33609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 33619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 33629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_GRADIENT) { 33669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // find the effect in effectSettings array 33679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<params->numberEffects;i++) { 33689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->effectsSettings[i].VideoEffectType == 33699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Gradient) 33709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 33719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyColorEffect(M4xVSS_kVideoEffectType_Gradient, 33739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 33749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, 33759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].xVSS.uiRgb16InputColor); 33769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 33779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 33789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_COLOR_RGB16) { 33829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Find the effect in effectSettings array 33839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<params->numberEffects;i++) { 33849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->effectsSettings[i].VideoEffectType == 33859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_ColorRGB16) 33869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 33879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyColorEffect(M4xVSS_kVideoEffectType_ColorRGB16, 33899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 33909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, 33919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].xVSS.uiRgb16InputColor); 33929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 33939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 33949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 33969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 33979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_FIFTIES) { 33989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Find the effect in effectSettings array 33999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<params->numberEffects;i++) { 34009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->effectsSettings[i].VideoEffectType == 34019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Fifties) 34029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 34039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i < params->numberEffects) { 34059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang computeProgressForVideoEffect(params->timeMs, 34069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiStartTime, 34079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiDuration, &extProgress); 34089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->isFiftiesEffectStarted) { 34109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fiftiesCtx.previousClipTime = -1; 34119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fiftiesCtx.fiftiesEffectDuration = 34139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 1000/params->effectsSettings[i].xVSS.uiFiftiesOutFrameRate; 34149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fiftiesCtx.shiftRandomValue = 0; 34169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang fiftiesCtx.stripeRandomValue = 0; 34179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VSS3GPP_externalVideoEffectFifties( 34199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_Void *)&fiftiesCtx, planeIn, planeOut, &extProgress, 34209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_kVideoEffectType_Fifties); 34219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 3423f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("M4VSS3GPP_externalVideoEffectFifties error 0x%x", (unsigned int)err); 34249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != finalOutputBuffer) { 34269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(finalOutputBuffer); 34279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang finalOutputBuffer = NULL; 34289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != tempOutputBuffer) { 34309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(tempOutputBuffer); 34319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang tempOutputBuffer = NULL; 34329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 34349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // The out plane now becomes the in plane for adding other effects 34379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang swapImagePlanes(planeIn, planeOut,(M4VIFI_UInt8 *)finalOutputBuffer, 34389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer); 34399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_FRAMING) { 34439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_FramingStruct framingCtx; 34459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Find the effect in effectSettings array 34469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<params->numberEffects;i++) { 34479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->effectsSettings[i].VideoEffectType == 34489969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VSS3GPP_VideoEffectType)M4xVSS_kVideoEffectType_Framing) { 34499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if((params->effectsSettings[i].uiStartTime <= params->timeMs + params->timeOffset) && 34509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang ((params->effectsSettings[i].uiStartTime+ 34519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiDuration) >= params->timeMs + params->timeOffset)) 34529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang { 34539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 34549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i < params->numberEffects) { 34589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang computeProgressForVideoEffect(params->timeMs, 34599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiStartTime, 34609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiDuration, &extProgress); 34619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = prepareFramingStructure(&framingCtx, 34639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings, i, params->overlayFrameRGBBuffer, 34649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->overlayFrameYUVBuffer); 34659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err == M4NO_ERROR) { 34679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = M4VSS3GPP_externalVideoEffectFraming( 34689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_Void *)&framingCtx, planeIn, planeOut, &extProgress, 34699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4xVSS_kVideoEffectType_Framing); 34709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(framingCtx.alphaBlendingStruct); 34739969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(framingCtx.FramingYuv != NULL) { 34759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(framingCtx.FramingYuv); 34769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang framingCtx.FramingYuv = NULL; 34779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34789969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang //If prepareFramingStructure / M4VSS3GPP_externalVideoEffectFraming 34799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // returned error, then return from function 34809969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 34819969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34829969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != finalOutputBuffer) { 34839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(finalOutputBuffer); 34849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang finalOutputBuffer = NULL; 34859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(NULL != tempOutputBuffer) { 34879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(tempOutputBuffer); 34889969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang tempOutputBuffer = NULL; 34899969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34909969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 34919969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34929969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34939969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // The out plane now becomes the in plane for adding other effects 34949969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang swapImagePlanes(planeIn, planeOut,(M4VIFI_UInt8 *)finalOutputBuffer, 34959969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer); 34969969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34979969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 34989969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 34999969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_FADEFROMBLACK) { 35009969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang /* find the effect in effectSettings array*/ 35019969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<params->numberEffects;i++) { 35029969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->effectsSettings[i].VideoEffectType == 35039969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VSS3GPP_kVideoEffectType_FadeFromBlack) 35049969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 35059969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35069969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35079969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i < params->numberEffects) { 35089969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang computePercentageDone(params->timeMs, 35099969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiStartTime, 35109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiDuration, &percentageDone); 35119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Compute where we are in the effect (scale is 0->1024) 35139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang lum_factor = (M4OSA_Int32)( percentageDone * 1024 ); 35149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Apply the darkening effect 35159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyLumaEffect(M4VSS3GPP_kVideoEffectType_FadeFromBlack, 35169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 35179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, lum_factor); 35189969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 35199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 35209969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->currentVideoEffect & VIDEO_EFFECT_FADETOBLACK) { 35259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Find the effect in effectSettings array 35269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang for(i=0;i<params->numberEffects;i++) { 35279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(params->effectsSettings[i].VideoEffectType == 35289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4VSS3GPP_kVideoEffectType_FadeToBlack) 35299969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang break; 35309969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(i < params->numberEffects) { 35329969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang computePercentageDone(params->timeMs, 35339969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiStartTime, 35349969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang params->effectsSettings[i].uiDuration, &percentageDone); 35359969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35369969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Compute where we are in the effect (scale is 0->1024) 35379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang lum_factor = (M4OSA_Int32)( (1.0-percentageDone) * 1024 ); 35389969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Apply the darkening effect 35399969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyLumaEffect(M4VSS3GPP_kVideoEffectType_FadeToBlack, 35409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang planeIn, planeOut, (M4VIFI_UInt8 *)finalOutputBuffer, 35419969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4VIFI_UInt8 *)tempOutputBuffer, lum_factor); 35429969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 35439969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 35449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35482703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("doMediaRendering CALL getBuffer()"); 35499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Set the output YUV420 plane to be compatible with YV12 format 35509969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // W & H even 35519969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // YVU instead of YUV 35529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // align buffers on 32 bits 35539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35549969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang // Y plane 35559969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang //in YV12 format, sizes must be even 35569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 yv12PlaneWidth = ((params->outVideoWidth +1)>>1)<<1; 35579969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang M4OSA_UInt32 yv12PlaneHeight = ((params->outVideoHeight+1)>>1)<<1; 35589969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35599969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang prepareYV12ImagePlane(planeOut, yv12PlaneWidth, yv12PlaneHeight, 35609969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang (M4OSA_UInt32)params->outBufferStride, (M4VIFI_UInt8 *)params->pOutBuffer); 35619969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35629969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang err = applyRenderingMode(planeIn, planeOut, params->renderingMode); 35639969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang 35649969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_NULL != finalOutputBuffer) { 35659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(finalOutputBuffer); 35669969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang finalOutputBuffer= M4OSA_NULL; 35679969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35689969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(M4OSA_NULL != tempOutputBuffer) { 35699969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang free(tempOutputBuffer); 35709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang tempOutputBuffer = M4OSA_NULL; 35719969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35729969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang if(err != M4NO_ERROR) { 35732703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block ALOGV("doVideoPostProcessing: applyRenderingMode returned err=%d",err); 35749969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return err; 35759969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang } 35769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang return M4NO_ERROR; 35779969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} 35788806b706693c0992724f6603353af18aeb4a0f80Hong Teng 35798806b706693c0992724f6603353af18aeb4a0f80Hong Tengandroid::status_t getVideoSizeByResolution( 35808806b706693c0992724f6603353af18aeb4a0f80Hong Teng M4VIDEOEDITING_VideoFrameSize resolution, 35818806b706693c0992724f6603353af18aeb4a0f80Hong Teng uint32_t *pWidth, uint32_t *pHeight) { 35828806b706693c0992724f6603353af18aeb4a0f80Hong Teng 35838806b706693c0992724f6603353af18aeb4a0f80Hong Teng uint32_t frameWidth, frameHeight; 35848806b706693c0992724f6603353af18aeb4a0f80Hong Teng 35858806b706693c0992724f6603353af18aeb4a0f80Hong Teng if (pWidth == NULL) { 3586f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("getVideoFrameSizeByResolution invalid pointer for pWidth"); 35878806b706693c0992724f6603353af18aeb4a0f80Hong Teng return android::BAD_VALUE; 35888806b706693c0992724f6603353af18aeb4a0f80Hong Teng } 35898806b706693c0992724f6603353af18aeb4a0f80Hong Teng if (pHeight == NULL) { 3590f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("getVideoFrameSizeByResolution invalid pointer for pHeight"); 35918806b706693c0992724f6603353af18aeb4a0f80Hong Teng return android::BAD_VALUE; 35928806b706693c0992724f6603353af18aeb4a0f80Hong Teng } 35938806b706693c0992724f6603353af18aeb4a0f80Hong Teng 35948806b706693c0992724f6603353af18aeb4a0f80Hong Teng switch (resolution) { 35958806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kSQCIF: 35968806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 128; 35978806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 96; 35988806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 35998806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36008806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kQQVGA: 36018806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 160; 36028806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 120; 36038806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36048806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36058806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kQCIF: 36068806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 176; 36078806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 144; 36088806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36098806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36108806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kQVGA: 36118806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 320; 36128806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 240; 36138806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36148806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36158806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kCIF: 36168806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 352; 36178806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 288; 36188806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36198806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36208806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kVGA: 36218806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 640; 36228806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 480; 36238806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36248806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36258806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kWVGA: 36268806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 800; 36278806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 480; 36288806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36298806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36308806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_kNTSC: 36318806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 720; 36328806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 480; 36338806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36348806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36358806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_k640_360: 36368806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 640; 36378806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 360; 36388806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36398806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36408806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_k854_480: 36418806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 854; 36428806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 480; 36438806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36448806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36458806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_k1280_720: 36468806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 1280; 36478806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 720; 36488806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36498806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36508806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_k1080_720: 36518806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 1080; 36528806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 720; 36538806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36548806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36558806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_k960_720: 36568806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 960; 36578806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 720; 36588806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36598806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36608806b706693c0992724f6603353af18aeb4a0f80Hong Teng case M4VIDEOEDITING_k1920_1080: 36618806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameWidth = 1920; 36628806b706693c0992724f6603353af18aeb4a0f80Hong Teng frameHeight = 1080; 36638806b706693c0992724f6603353af18aeb4a0f80Hong Teng break; 36648806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36658806b706693c0992724f6603353af18aeb4a0f80Hong Teng default: 3666f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("Unsupported video resolution %d.", resolution); 36678806b706693c0992724f6603353af18aeb4a0f80Hong Teng return android::BAD_VALUE; 36688806b706693c0992724f6603353af18aeb4a0f80Hong Teng } 36698806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36708806b706693c0992724f6603353af18aeb4a0f80Hong Teng *pWidth = frameWidth; 36718806b706693c0992724f6603353af18aeb4a0f80Hong Teng *pHeight = frameHeight; 36728806b706693c0992724f6603353af18aeb4a0f80Hong Teng 36738806b706693c0992724f6603353af18aeb4a0f80Hong Teng return android::OK; 36748806b706693c0992724f6603353af18aeb4a0f80Hong Teng} 3675e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3676e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4VIFI_UInt8 M4VIFI_Rotate90LeftYUV420toYUV420(void* pUserData, 3677e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut) { 3678e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3679e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Int32 plane_number; 3680e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_UInt32 i,j, u_stride; 3681e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_UInt8 *p_buf_src, *p_buf_dest; 3682e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3683e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on Y,U and V planes */ 3684e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (plane_number = 0; plane_number < 3; plane_number++) { 3685e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Get adresses of first valid pixel in input and output buffer */ 3686e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< As we have a -90° rotation, first needed pixel is the upper-right one */ 3687e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src = 3688e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury &(pPlaneIn[plane_number].pac_data[pPlaneIn[plane_number].u_topleft]) + 3689e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_height - 1 ; 3690e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest = 3691e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury &(pPlaneOut[plane_number].pac_data[pPlaneOut[plane_number].u_topleft]); 3692e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury u_stride = pPlaneIn[plane_number].u_stride; 3693e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on output rows */ 3694e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (i = 0; i < pPlaneOut[plane_number].u_height; i++) { 3695e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on all output pixels in a row */ 3696e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (j = 0; j < pPlaneOut[plane_number].u_width; j++) { 3697e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury *p_buf_dest++= *p_buf_src; 3698e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src += u_stride; /**< Go to the next row */ 3699e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3700e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3701e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go on next row of the output frame */ 3702e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest += 3703e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride - pPlaneOut[plane_number].u_width; 3704e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go to next pixel in the last row of the input frame*/ 3705e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src -= 3706e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[plane_number].u_stride * pPlaneOut[plane_number].u_width + 1 ; 3707e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3708e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3709e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3710e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4VIFI_OK; 3711e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury} 3712e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3713e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4VIFI_UInt8 M4VIFI_Rotate90RightYUV420toYUV420(void* pUserData, 3714e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut) { 3715e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3716e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Int32 plane_number; 3717e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_UInt32 i,j, u_stride; 3718e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_UInt8 *p_buf_src, *p_buf_dest; 3719e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3720e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on Y,U and V planes */ 3721e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (plane_number = 0; plane_number < 3; plane_number++) { 3722e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Get adresses of first valid pixel in input and output buffer */ 3723e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< As we have a +90° rotation, first needed pixel is the left-down one */ 3724e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src = 3725e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury &(pPlaneIn[plane_number].pac_data[pPlaneIn[plane_number].u_topleft]) + 3726e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (pPlaneIn[plane_number].u_stride * (pPlaneOut[plane_number].u_width - 1)); 3727e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest = 3728e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury &(pPlaneOut[plane_number].pac_data[pPlaneOut[plane_number].u_topleft]); 3729e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury u_stride = pPlaneIn[plane_number].u_stride; 3730e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on output rows */ 3731e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (i = 0; i < pPlaneOut[plane_number].u_height; i++) { 3732e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on all output pixels in a row */ 3733e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (j = 0; j < pPlaneOut[plane_number].u_width; j++) { 3734e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury *p_buf_dest++= *p_buf_src; 3735e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src -= u_stride; /**< Go to the previous row */ 3736e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3737e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3738e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go on next row of the output frame */ 3739e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest += 3740e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride - pPlaneOut[plane_number].u_width; 3741e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go to next pixel in the last row of the input frame*/ 3742e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src += 3743e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[plane_number].u_stride * pPlaneOut[plane_number].u_width +1 ; 3744e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3745e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3746e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3747e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4VIFI_OK; 3748e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury} 3749e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3750e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4VIFI_UInt8 M4VIFI_Rotate180YUV420toYUV420(void* pUserData, 3751e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_ImagePlane *pPlaneIn, M4VIFI_ImagePlane *pPlaneOut) { 3752e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Int32 plane_number; 3753e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_UInt32 i,j; 3754e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_UInt8 *p_buf_src, *p_buf_dest, temp_pix1; 3755e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3756e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on Y,U and V planes */ 3757e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (plane_number = 0; plane_number < 3; plane_number++) { 3758e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Get adresses of first valid pixel in input and output buffer */ 3759e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src = 3760e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury &(pPlaneIn[plane_number].pac_data[pPlaneIn[plane_number].u_topleft]); 3761e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest = 3762e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury &(pPlaneOut[plane_number].pac_data[pPlaneOut[plane_number].u_topleft]); 3763e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3764e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< If pPlaneIn = pPlaneOut, the algorithm will be different */ 3765e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (p_buf_src == p_buf_dest) { 3766e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Get Address of last pixel in the last row of the frame */ 3767e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest += 3768e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride*(pPlaneOut[plane_number].u_height-1) + 3769e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_width - 1; 3770e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3771e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< We loop (height/2) times on the rows. 3772e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury * In case u_height is odd, the row at the middle of the frame 3773e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury * has to be processed as must be mirrored */ 3774e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (i = 0; i < ((pPlaneOut[plane_number].u_height)>>1); i++) { 3775e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (j = 0; j < pPlaneOut[plane_number].u_width; j++) { 3776e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury temp_pix1= *p_buf_dest; 3777e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury *p_buf_dest--= *p_buf_src; 3778e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury *p_buf_src++ = temp_pix1; 3779e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3780e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go on next row in top of frame */ 3781e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src += 3782e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride - pPlaneOut[plane_number].u_width; 3783e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go to the last pixel in previous row in bottom of frame*/ 3784e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest -= 3785e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride - pPlaneOut[plane_number].u_width; 3786e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3787e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3788e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Mirror middle row in case height is odd */ 3789e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if ((pPlaneOut[plane_number].u_height%2)!= 0) { 3790e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src = 3791e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury &(pPlaneOut[plane_number].pac_data[pPlaneIn[plane_number].u_topleft]); 3792e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src += 3793e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride*(pPlaneOut[plane_number].u_height>>1); 3794e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest = 3795e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src + pPlaneOut[plane_number].u_width; 3796e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3797e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< We loop u_width/2 times on this row. 3798e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury * In case u_width is odd, the pixel at the middle of this row 3799e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury * remains unchanged */ 3800e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (j = 0; j < (pPlaneOut[plane_number].u_width>>1); j++) { 3801e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury temp_pix1= *p_buf_dest; 3802e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury *p_buf_dest--= *p_buf_src; 3803e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury *p_buf_src++ = temp_pix1; 3804e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3805e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3806e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } else { 3807e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Get Address of last pixel in the last row of the output frame */ 3808e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest += 3809e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride*(pPlaneOut[plane_number].u_height-1) + 3810e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[plane_number].u_width - 1; 3811e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3812e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Loop on rows */ 3813e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (i = 0; i < pPlaneOut[plane_number].u_height; i++) { 3814e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury for (j = 0; j < pPlaneOut[plane_number].u_width; j++) { 3815e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury *p_buf_dest--= *p_buf_src++; 3816e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3817e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3818e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go on next row in top of input frame */ 3819e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_src += 3820e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneIn[plane_number].u_stride - pPlaneOut[plane_number].u_width; 3821e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury /**< Go to last pixel of previous row in bottom of input frame*/ 3822e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury p_buf_dest -= 3823e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury pPlaneOut[plane_number].u_stride - pPlaneOut[plane_number].u_width; 3824e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3825e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3826e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3827e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3828e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4VIFI_OK; 3829e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury} 3830e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3831e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh ChowduryM4OSA_ERR applyVideoRotation(M4OSA_Void* pBuffer, M4OSA_UInt32 width, 3832e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt32 height, M4OSA_UInt32 rotation) { 3833e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3834e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_ERR err = M4NO_ERROR; 3835e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_ImagePlane planeIn[3], planeOut[3]; 3836e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3837e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (pBuffer == M4OSA_NULL) { 3838f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("applyVideoRotation: NULL input frame"); 3839e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4ERR_PARAMETER; 3840e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3841e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4OSA_UInt8* outPtr = (M4OSA_UInt8 *)M4OSA_32bitAlignedMalloc( 3842e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury (width*height*1.5), M4VS, (M4OSA_Char*)("rotation out ptr")); 3843e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (outPtr == M4OSA_NULL) { 3844e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return M4ERR_ALLOC; 3845e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3846e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3847e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // In plane 3848e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury prepareYUV420ImagePlane(planeIn, width, 3849e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury height, (M4VIFI_UInt8 *)pBuffer, width, height); 3850e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3851e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // Out plane 3852e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury if (rotation != 180) { 3853e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury prepareYUV420ImagePlane(planeOut, height, 3854e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury width, outPtr, height, width); 3855e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3856e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3857e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury switch(rotation) { 3858e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury case 90: 3859e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Rotate90RightYUV420toYUV420(M4OSA_NULL, planeIn, planeOut); 3860e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memcpy(pBuffer, (void *)outPtr, (width*height*1.5)); 3861e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3862e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3863e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury case 180: 3864e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury // In plane rotation, so planeOut = planeIn 3865e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Rotate180YUV420toYUV420(M4OSA_NULL, planeIn, planeIn); 3866e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3867e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3868e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury case 270: 3869e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury M4VIFI_Rotate90LeftYUV420toYUV420(M4OSA_NULL, planeIn, planeOut); 3870e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury memcpy(pBuffer, (void *)outPtr, (width*height*1.5)); 3871e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3872e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3873e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury default: 3874f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block ALOGE("invalid rotation param %d", (int)rotation); 3875e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury err = M4ERR_PARAMETER; 3876e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury break; 3877e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury } 3878e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3879e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury free((void *)outPtr); 3880e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury return err; 3881e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3882e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury} 3883e9eec0e0975c57c0dac91eb5b4cbb052b7dd011aRajneesh Chowdury 3884