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