182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON/* 282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Licensed under the Apache License, Version 2.0 (the "License"); 582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* you may not use this file except in compliance with the License. 682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* You may obtain a copy of the License at 782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* http://www.apache.org/licenses/LICENSE-2.0 982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 1082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Unless required by applicable law or agreed to in writing, software 1182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* distributed under the License is distributed on an "AS IS" BASIS, 1282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* See the License for the specific language governing permissions and 1482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* limitations under the License. 1582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*/ 1682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderLog.h" 1882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderUtils.h" 1982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <va/va_android.h> 2082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <va/va_drmcommon.h> 2182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef IMG_GFX 23fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan#include "hal_public.h" 24c7062268956b5b8cbeab3f7c824eb0fb797f4259Vinil Cheeramvelil#include <sync/sync.h> 2582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON//#define GFX_DUMP 2782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#define OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar 0x7FA00E00 2982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 30fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachanstatic const hw_device_t *gGralloc; 3182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 3282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstatic int gfx_init(void) { 3382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 34fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan int err = gralloc_open_img(&gGralloc); 3582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (err) { 3682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 3782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 3882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else 3982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("hw_get_module returned\n"); 4082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return 0; 4282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 4382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstatic int gfx_alloc(uint32_t w, uint32_t h, int format, 45fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan int usage, buffer_handle_t* handle, int32_t* stride) { 4682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int err; 4882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 49fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (!gGralloc) { 50fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (gfx_init()) { 51fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan LOG_E("can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 5282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 5382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 5482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 5582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 56fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan err = gralloc_device_alloc_img(gGralloc, w, h, format, usage, handle, 57fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan stride); 5882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (err) { 5982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("alloc(%u, %u, %d, %08x, ...) failed %d (%s)\n", 6082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON w, h, format, usage, err, strerror(-err)); 6182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 6282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return err; 6482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 6582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstatic int gfx_free(buffer_handle_t handle) { 6782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 6882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int err; 6982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 70fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (!gGralloc) { 71fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (gfx_init()) { 72fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan LOG_E("can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 7382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 7482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 7582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 7682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 77fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan err = gralloc_device_free_img(gGralloc, handle); 7882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (err) { 7982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("free(...) failed %d (%s)\n", err, strerror(-err)); 8082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 8182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return err; 8382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 8482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstatic int gfx_lock(buffer_handle_t handle, int usage, 86fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan int left, int top, int width, int height, void** vaddr) { 8782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int err; 8982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 90fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (!gGralloc) { 9182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (gfx_init()) { 9282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 9382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 9482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 9582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 9682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 97fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan const gralloc1_rect_t r = { 98fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan .left = left, 99fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan .top = top, 100fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan .width = width, 101fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan .height = height 102fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan }; 10382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 104fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan err = gralloc_lock_async_img(gGralloc, handle, usage, &r, vaddr, -1); 105fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan 106fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan LOG_V("gfx_lock: handle is %x, usage is %x, vaddr is %x.\n", 107fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan (unsigned int)handle, usage, (unsigned int)*vaddr); 108fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan 109fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (err) { 11082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("lock(...) failed %d (%s).\n", err, strerror(-err)); 11182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 11282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else 11382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("lock returned with address %p\n", *vaddr); 11482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return err; 11682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 11782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstatic int gfx_unlock(buffer_handle_t handle) { 11982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 120fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan int err, releaseFence = -1; 12182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 122fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (!gGralloc) { 12382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (gfx_init()) { 12482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 12582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 12682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 12782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 12882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 129fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan err = gralloc_unlock_async_img(gGralloc, handle, &releaseFence); 130fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (releaseFence >= 0) { 131fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan sync_wait(releaseFence, -1); 132fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan close(releaseFence); 133fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan } 13482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (err) { 13582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("unlock(...) failed %d (%s)", err, strerror(-err)); 13682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 13782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else 13882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("unlock returned\n"); 13982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 14082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return err; 14182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 14282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 14382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstatic int gfx_Blit(buffer_handle_t src, buffer_handle_t dest, 14482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int w, int h, int , int ) 14582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON{ 146fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan int err, releaseFence = -1; 14782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 148fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (!gGralloc) { 14982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (gfx_init()) { 15082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("can't find the %s module", GRALLOC_HARDWARE_MODULE_ID); 15182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 15282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 15382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 15482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 155fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan err = gralloc_blit_handle_to_handle_img(gGralloc, src, dest, w, h, 0, 0, 156fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan 0, -1, &releaseFence); 157fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan if (releaseFence >= 0) { 158fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan sync_wait(releaseFence, -1); 159fa4e52e686a1097074b2ac667bcffda507648e42Alistair Strachan close(releaseFence); 160c7062268956b5b8cbeab3f7c824eb0fb797f4259Vinil Cheeramvelil } 16182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (err) { 162308d6505aa49afb36fb8aced906dd1af072df1fdAlistair Strachan LOG_E("Blit failed %d (%s)", err, strerror(-err)); 16382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return -1; 16482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else 16582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_V("Blit returned\n"); 16682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 16782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return err; 16882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 16982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 17082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status GetGfxBufferInfo(intptr_t handle, ValueInfo& vinfo){ 17182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 17282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON /* only support OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar 17382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON HAL_PIXEL_FORMAT_NV12 17482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON HAL_PIXEL_FORMAT_BGRA_8888 17582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON HAL_PIXEL_FORMAT_RGBA_8888 17682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON HAL_PIXEL_FORMAT_RGBX_8888 17782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON HAL_PIXEL_FORMAT_BGRX_8888 */ 17882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON IMG_native_handle_t* h = (IMG_native_handle_t*) handle; 17982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 18082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.width = h->iWidth; 18182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.height = h->iHeight; 18282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.lumaStride = h->iWidth; 18382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 18467efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("GetGfxBufferInfo: gfx iWidth=%d, iHeight=%d, iFormat=%x in handle structure\n", h->iWidth, h->iHeight, h->iFormat); 18582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 18682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (h->iFormat == HAL_PIXEL_FORMAT_NV12) { 18782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #ifdef MRFLD_GFX 1888e103bbca35f013a21b7a4c0c771dfeb65464554Vinil Cheeramvelil vinfo.lumaStride = (h->iWidth + 63) & ~63; //64 aligned 18982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #else //on CTP 19082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (h->iWidth > 512) 19182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.lumaStride = (h->iWidth + 63) & ~63; //64 aligned 19282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else 19382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.lumaStride = 512; 19482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #endif 19582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if ((h->iFormat == HAL_PIXEL_FORMAT_BGRA_8888)|| 19682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (h->iFormat == HAL_PIXEL_FORMAT_RGBA_8888)|| 19782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (h->iFormat == HAL_PIXEL_FORMAT_RGBX_8888)|| 19882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (h->iFormat == HAL_PIXEL_FORMAT_BGRX_8888)) { 19982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.lumaStride = (h->iWidth + 31) & ~31; 20082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else if (h->iFormat == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar) { 20182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //nothing to do 20282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else 20382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 20482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 20582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.format = h->iFormat; 20682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 20767efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Actual Width=%d, Height=%d, Stride=%d\n\n", vinfo.width, vinfo.height, vinfo.lumaStride); 20882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 20982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 21082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 21182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef GFX_DUMP 21282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid DumpGfx(intptr_t handle, char* filename) { 21382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ValueInfo vinfo; 21482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON void* vaddr[3]; 21582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON FILE* fp; 21682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_OFTEN; 21782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 21882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON GetGfxBufferInfo(handle, vinfo); 21982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (gfx_lock((buffer_handle_t)handle, usage, 0, 0, vinfo.width, vinfo.height, &vaddr[0]) != 0) 22082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_DRIVER_FAIL; 22182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON fp = fopen(filename, "wb"); 22282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON fwrite(vaddr[0], 1, vinfo.lumaStride * vinfo.height * 4, fp); 22382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON fclose(fp); 22482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I("dump %d bytes data to %s\n", vinfo.lumaStride * vinfo.height * 4, filename); 22582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON gfx_unlock((buffer_handle_t)handle); 22682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 22782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return; 22882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 22982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif 23082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 23182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif 23282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 23382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONextern "C" { 23482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVAStatus vaLockSurface(VADisplay dpy, 23582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceID surface, 23682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *fourcc, 23782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *luma_stride, 23882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *chroma_u_stride, 23982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *chroma_v_stride, 24082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *luma_offset, 24182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *chroma_u_offset, 24282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *chroma_v_offset, 24382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned int *buffer_name, 24482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON void **buffer 24582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON); 24682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 24782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVAStatus vaUnlockSurface(VADisplay dpy, 24882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceID surface 24982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON); 25082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 25182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 25282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVASurfaceMap::VASurfaceMap(VADisplay display, int hwcap) { 25382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 25482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVADisplay = display; 25582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mSupportedSurfaceMemType = hwcap; 25682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mValue = 0; 25782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurface = VA_INVALID_SURFACE; 25882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mTracked = false; 25982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mAction = 0; 26082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memset(&mVinfo, 0, sizeof(ValueInfo)); 26182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef IMG_GFX 26282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mGfxHandle = NULL; 26382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif 26482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 26582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 26682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVASurfaceMap::~VASurfaceMap() { 26782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 26882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (!mTracked && (mVASurface != VA_INVALID_SURFACE)) 26982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaDestroySurfaces(mVADisplay, &mVASurface, 1); 27082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 27182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef IMG_GFX 27282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mGfxHandle) 27382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON gfx_free(mGfxHandle); 27482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif 27582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 27682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 27782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::doMapping() { 27882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 27982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 28082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 28182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVASurface == VA_INVALID_SURFACE) { 28282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 28382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int width = mVASurfaceWidth = mVinfo.width; 28482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int height = mVASurfaceHeight = mVinfo.height; 28582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int stride = mVASurfaceStride = mVinfo.lumaStride; 28682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 28782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mAction & MAP_ACTION_COLORCONVERT) { 28882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 28982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //only support gfx buffer 29082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVinfo.mode != MEM_MODE_GFXHANDLE) 29182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 29282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 29382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #ifdef IMG_GFX //only enable on IMG chip 29482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 29582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //do not trust valueinfo for gfx case, directly get from structure 29682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ValueInfo tmp; 29782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 29882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = GetGfxBufferInfo(mValue, tmp); 29982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("GetGfxBufferInfo"); 30082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON width = tmp.width; 30182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON height = tmp.height; 30282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON stride = tmp.lumaStride; 30382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 30482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (HAL_PIXEL_FORMAT_NV12 == tmp.format || OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar == tmp.format) 30582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mAction &= ~MAP_ACTION_COLORCONVERT; 30682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else { 30782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //allocate new gfx buffer if format is not NV12 30882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int usage = GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE; 30982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 31082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //use same size with original and HAL_PIXEL_FORMAT_NV12 format 31182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (gfx_alloc(width, height, HAL_PIXEL_FORMAT_NV12, usage, &mGfxHandle, &stride) != 0) 31282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_DRIVER_FAIL; 31382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 31467efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Create an new gfx buffer handle 0x%p for color convert, width=%d, height=%d, stride=%d\n", 31582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mGfxHandle, width, height, stride); 31682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 31782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 31882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #else 31982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 32082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #endif 32182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 32282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 32382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mAction & MAP_ACTION_ALIGN64 && stride % 64 != 0) { 32482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //check if stride is not 64 aligned, must allocate new 64 aligned vasurface 32582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON stride = (stride + 63 ) & ~63; 32682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mAction |= MAP_ACTION_COPY; 32782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 32882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 32982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if(mAction & MAP_ACTION_ALIGN64 && width <= 320 && height <= 240) { 33082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mAction |= MAP_ACTION_COPY; 33182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 33282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 33382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mAction & MAP_ACTION_COPY) { //must allocate new vasurface(EXternalMemoryNULL, uncached) 33482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //allocate new vasurface 33582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurface = CreateNewVASurface(mVADisplay, stride, height); 33682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVASurface == VA_INVALID_SURFACE) 33782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_DRIVER_FAIL; 33882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceWidth = mVASurfaceStride = stride; 33982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceHeight = height; 34082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOGI("create new vaSurface for MAP_ACTION_COPY\n"); 34182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 34282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #ifdef IMG_GFX 34382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mGfxHandle != NULL) { 34482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //map new gfx handle to vasurface 34582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = MappingGfxHandle((intptr_t)mGfxHandle); 34682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("MappingGfxHandle"); 34767efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOGV("map new allocated gfx handle to vaSurface\n"); 34882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else 34982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #endif 35082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON { 35182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //map original value to vasurface 35282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = MappingToVASurface(); 35382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("MappingToVASurface"); 35482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 35582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 35682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 35782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 35882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mAction & MAP_ACTION_COLORCONVERT) { 35982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = doActionColConv(); 36082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("doActionColConv"); 36182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 36282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 36382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mAction & MAP_ACTION_COPY) { 36482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //keep src color format is NV12, then do copy 36582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = doActionCopy(); 36682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("doActionCopy"); 36782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 36882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 36982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 37082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 37182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 37282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::MappingToVASurface() { 37382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 37482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret = ENCODE_SUCCESS; 37582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 37682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVASurface != VA_INVALID_SURFACE) { 37782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I("VASurface is already set before, nothing to do here\n"); 37882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 37982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 38067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("MappingToVASurface mode=%d, value=%p\n", mVinfo.mode, (void*)mValue); 38182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 38282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON const char *mode = NULL; 38382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON switch (mVinfo.mode) { 38482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_SURFACE: 38582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mode = "SURFACE"; 38682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = MappingSurfaceID(mValue); 38782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 38882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_GFXHANDLE: 38982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mode = "GFXHANDLE"; 39082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = MappingGfxHandle(mValue); 39182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 39282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_KBUFHANDLE: 39382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mode = "KBUFHANDLE"; 39482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = MappingKbufHandle(mValue); 39582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 39682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_MALLOC: 39782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_NONECACHE_USRPTR: 39882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mode = "MALLOC or NONCACHE_USRPTR"; 39982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = MappingMallocPTR(mValue); 40082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 40182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_ION: 40282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_V4L2: 40382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_USRPTR: 40482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_CI: 40582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON default: 40682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I("UnSupported memory mode 0x%08x", mVinfo.mode); 40782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 40882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 40982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 41067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("%s: Format=%x, lumaStride=%d, width=%d, height=%d\n", mode, mVinfo.format, mVinfo.lumaStride, mVinfo.width, mVinfo.height); 41167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("vaSurface 0x%08x is created for value = 0x%p\n", mVASurface, (void*)mValue); 41282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 41382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ret; 41482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 41582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 41682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::MappingSurfaceID(intptr_t value) { 41782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 41882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 41982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 42082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //try to get kbufhandle from SurfaceID 42182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t fourCC = 0; 42282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t lumaStride = 0; 42382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t chromaUStride = 0; 42482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t chromaVStride = 0; 42582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t lumaOffset = 0; 42682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t chromaUOffset = 0; 42782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t chromaVOffset = 0; 42882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t kBufHandle = 0; 42982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 43082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaLockSurface( 43182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON (VADisplay)mVinfo.handle, (VASurfaceID)value, 43282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &fourCC, &lumaStride, &chromaUStride, &chromaVStride, 43382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON &lumaOffset, &chromaUOffset, &chromaVOffset, &kBufHandle, NULL); 43482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 43582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaLockSurface"); 43667efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Surface incoming = 0x%p\n", (void*)value); 43767efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("lumaStride = %d, chromaUStride = %d, chromaVStride=%d\n", lumaStride, chromaUStride, chromaVStride); 43867efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("lumaOffset = %d, chromaUOffset = %d, chromaVOffset = %d\n", lumaOffset, chromaUOffset, chromaVOffset); 43967efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("kBufHandle = 0x%08x, fourCC = %d\n", kBufHandle, fourCC); 44082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 44182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnlockSurface((VADisplay)mVinfo.handle, (VASurfaceID)value); 44282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnlockSurface"); 44382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 44482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVinfo.mode = MEM_MODE_KBUFHANDLE; 44582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVinfo.size = mVinfo.lumaStride * mVinfo.height * 1.5; 44682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 44782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurface = CreateSurfaceFromExternalBuf(kBufHandle, mVinfo); 44882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVASurface == VA_INVALID_SURFACE) 44982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_SURFACE; 45082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 45182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceWidth = mVinfo.width; 45282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceHeight = mVinfo.height; 45382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceStride = mVinfo.lumaStride; 45482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 45582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 45682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 45782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::MappingGfxHandle(intptr_t value) { 45882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 45967efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("MappingGfxHandle %p......\n", (void*)value); 46067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("format = 0x%08x, lumaStride = %d in ValueInfo\n", mVinfo.format, mVinfo.lumaStride); 46182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 46282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //default value for all HW platforms, maybe not accurate 46382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceWidth = mVinfo.width; 46482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceHeight = mVinfo.height; 46582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceStride = mVinfo.lumaStride; 46682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 46782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef IMG_GFX 46882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret; 46982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ValueInfo tmp; 47082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 47182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = GetGfxBufferInfo(value, tmp); 47282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("GetGfxBufferInfo"); 47382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceWidth = tmp.width; 47482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceHeight = tmp.height; 47582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceStride = tmp.lumaStride; 47682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif 47782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 47867efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Mapping vasurface Width=%d, Height=%d, Stride=%d\n", mVASurfaceWidth, mVASurfaceHeight, mVASurfaceStride); 47982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 48082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ValueInfo vinfo; 48182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memset(&vinfo, 0, sizeof(ValueInfo)); 48282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.mode = MEM_MODE_GFXHANDLE; 48382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.width = mVASurfaceWidth; 48482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.height = mVASurfaceHeight; 48582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.lumaStride = mVASurfaceStride; 48682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurface = CreateSurfaceFromExternalBuf(value, vinfo); 48782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVASurface == VA_INVALID_SURFACE) 48882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_SURFACE; 48982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 49082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 49182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 49282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 49382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::MappingKbufHandle(intptr_t value) { 49482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 49567efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("MappingKbufHandle value=%p\n", (void*)value); 49682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 49782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVinfo.size = mVinfo.lumaStride * mVinfo.height * 1.5; 49882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurface = CreateSurfaceFromExternalBuf(value, mVinfo); 49982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVASurface == VA_INVALID_SURFACE) 50082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_SURFACE; 50182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 50282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceWidth = mVinfo.width; 50382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceHeight = mVinfo.height; 50482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceStride = mVinfo.lumaStride; 50582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 50682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 50782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 50882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 50982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::MappingMallocPTR(intptr_t value) { 51082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 51182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurface = CreateSurfaceFromExternalBuf(value, mVinfo); 51282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVASurface == VA_INVALID_SURFACE) 51382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_SURFACE; 51482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 51582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceWidth = mVinfo.width; 51682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceHeight = mVinfo.height; 51782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVASurfaceStride = mVinfo.lumaStride; 51882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 51982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 52082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 52182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 52282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON//always copy with same color format NV12 52382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::doActionCopy() { 52482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 52582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus = VA_STATUS_SUCCESS; 52682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 52782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t width = 0, height = 0, stride = 0; 52882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t *pSrcBuffer, *pDestBuffer; 52982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON intptr_t handle = 0; 53082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 53167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Copying Src Buffer data to VASurface\n"); 53282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 53382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVinfo.mode != MEM_MODE_MALLOC && mVinfo.mode != MEM_MODE_GFXHANDLE) { 53482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("Not support copy in mode %d", mVinfo.mode); 53582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 53682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 53782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 53867efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Src Buffer information\n"); 53967efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Mode = %d, width = %d, stride = %d, height = %d\n", 54082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVinfo.mode, mVinfo.width, mVinfo.lumaStride, mVinfo.height); 54182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 54282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t srcY_offset, srcUV_offset; 54382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t srcY_pitch, srcUV_pitch; 54482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 54582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVinfo.mode == MEM_MODE_MALLOC) { 54682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON width = mVinfo.width; 54782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON height = mVinfo.height; 54882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON stride = mVinfo.lumaStride; 54982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON pSrcBuffer = (uint8_t*) mValue; 55082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcY_offset = 0; 55182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcUV_offset = stride * height; 55282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcY_pitch = stride; 55382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcUV_pitch = stride; 55482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } else { 55582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 55682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #ifdef IMG_GFX //only enable on IMG chips 55782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_OFTEN; 55882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 55982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //do not trust valueinfo, directly get from structure 56082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON Encode_Status ret; 56182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ValueInfo tmp; 56282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 56382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mGfxHandle) 56482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON handle = (intptr_t) mGfxHandle; 56582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON else 56682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON handle = mValue; 56782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 56882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ret = GetGfxBufferInfo(handle, tmp); 56982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_ENCODE_STATUS_RETURN("GetGfxBufferInfo"); 57082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON width = tmp.width; 57182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON height = tmp.height; 57282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON stride = tmp.lumaStride; 57382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 57482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //only support HAL_PIXEL_FORMAT_NV12 & OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar 57582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (HAL_PIXEL_FORMAT_NV12 != tmp.format && OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar != tmp.format) { 57682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("Not support gfx buffer format %x", tmp.format); 57782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 57882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 57982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 58082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcY_offset = 0; 58182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcUV_offset = stride * height; 58282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcY_pitch = stride; 58382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcUV_pitch = stride; 58482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 58582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //lock gfx handle with buffer real size 58682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON void* vaddr[3]; 58782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (gfx_lock((buffer_handle_t) handle, usage, 0, 0, width, height, &vaddr[0]) != 0) 58882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_DRIVER_FAIL; 58982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON pSrcBuffer = (uint8_t*)vaddr[0]; 59082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #else 59182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 59282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 59382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #endif 59482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 59582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 59682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 59782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAImage destImage; 59882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaDeriveImage(mVADisplay, mVASurface, &destImage); 59982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaDeriveImage"); 60082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaMapBuffer(mVADisplay, destImage.buf, (void **)&pDestBuffer); 60182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaMapBuffer"); 60282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 60367efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("\nDest VASurface information\n"); 60467efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("pitches[0] = %d\n", destImage.pitches[0]); 60567efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("pitches[1] = %d\n", destImage.pitches[1]); 60667efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("offsets[0] = %d\n", destImage.offsets[0]); 60767efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("offsets[1] = %d\n", destImage.offsets[1]); 60867efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("num_planes = %d\n", destImage.num_planes); 60967efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("width = %d\n", destImage.width); 61067efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("height = %d\n", destImage.height); 61182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 61282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (width > destImage.width || height > destImage.height) { 61382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("src buffer is bigger than destination buffer\n"); 61482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_INVALID_PARAMS; 61582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 61682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 61782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t *srcY, *dstY; 61882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t *srcUV, *dstUV; 61982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 62082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcY = pSrcBuffer + srcY_offset; 62182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dstY = pDestBuffer + destImage.offsets[0]; 62282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcUV = pSrcBuffer + srcUV_offset; 62382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dstUV = pDestBuffer + destImage.offsets[1]; 62482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 62582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON for (uint32_t i = 0; i < height; i++) { 62682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memcpy(dstY, srcY, width); 62782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcY += srcY_pitch; 62882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dstY += destImage.pitches[0]; 62982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 63082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 63182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON for (uint32_t i = 0; i < height / 2; i++) { 63282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON memcpy(dstUV, srcUV, width); 63382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON srcUV += srcUV_pitch; 63482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dstUV += destImage.pitches[1]; 63582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 63682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 63782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaUnmapBuffer(mVADisplay, destImage.buf); 63882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaUnmapBuffer"); 63982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaDestroyImage(mVADisplay, destImage.image_id); 64082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON CHECK_VA_STATUS_RETURN("vaDestroyImage"); 64182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 64282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef IMG_GFX 64382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mVinfo.mode == MEM_MODE_GFXHANDLE) { 64482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //unlock gfx handle 64582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON gfx_unlock((buffer_handle_t) handle); 64682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 64782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif 64867efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("Copying Src Buffer data to VASurface Complete\n"); 64982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 65082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 65182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 65282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 65382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONEncode_Status VASurfaceMap::doActionColConv() { 65482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 65582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef IMG_GFX 65682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (mGfxHandle == NULL) { 65782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("something wrong, why new gfxhandle is not allocated? \n"); 65882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_FAIL; 65982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 66082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 66167efa6523d593d3ebdb3e22eafb186e26d4bad74ywan LOG_V("doActionColConv gfx_Blit width=%d, height=%d\n", mVinfo.width, mVinfo.height); 66282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (gfx_Blit((buffer_handle_t)mValue, mGfxHandle, 66382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON mVinfo.width, mVinfo.height, 0, 0) != 0) 66482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_DRIVER_FAIL; 66582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 66682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #ifdef GFX_DUMP 66782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_I("dumpping gfx data.....\n"); 66882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON DumpGfx(mValue, "/data/dump.rgb"); 66982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON DumpGfx((intptr_t)mGfxHandle, "/data/dump.yuv"); 67082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON #endif 67182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_SUCCESS; 67282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 67382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#else 67482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return ENCODE_NOT_SUPPORTED; 67582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif 67682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 67782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 67882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVASurfaceID VASurfaceMap::CreateSurfaceFromExternalBuf(intptr_t value, ValueInfo& vinfo) { 67982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 68082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus; 68182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceAttribExternalBuffers extbuf; 68282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceAttrib attribs[2]; 68382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceID surface = VA_INVALID_SURFACE; 68482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int type; 68582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned long data = value; 68682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 68782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pixel_format = VA_FOURCC_NV12; 68882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.width = vinfo.width; 68982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.height = vinfo.height; 69082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.data_size = vinfo.size; 69182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (extbuf.data_size == 0) 69282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.data_size = vinfo.lumaStride * vinfo.height * 1.5; 69382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.num_buffers = 1; 69482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.num_planes = 3; 69582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[0] = vinfo.lumaStride; 69682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[1] = vinfo.lumaStride; 69782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[2] = vinfo.lumaStride; 69882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[3] = 0; 69982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[0] = 0; 70082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[1] = vinfo.lumaStride * vinfo.height; 70182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[2] = extbuf.offsets[1]; 70282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[3] = 0; 70382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.buffers = &data; 70482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.flags = 0; 70582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.private_data = NULL; 70682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 70782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON switch(vinfo.mode) { 70882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_GFXHANDLE: 70982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON type = VA_SURFACE_ATTRIB_MEM_TYPE_ANDROID_GRALLOC; 71082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 71182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_KBUFHANDLE: 71282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON type = VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM; 71382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 71482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_MALLOC: 71582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON type = VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR; 71682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 71782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_NONECACHE_USRPTR: 71882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON type = VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR; 71982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.flags |= VA_SURFACE_EXTBUF_DESC_UNCACHED; 72082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON break; 72182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_SURFACE: 72282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_ION: 72382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_V4L2: 72482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_USRPTR: 72582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON case MEM_MODE_CI: 72682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON default: 72782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON //not support 72882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return VA_INVALID_SURFACE; 72982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 73082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 73182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (!(mSupportedSurfaceMemType & type)) 73282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return VA_INVALID_SURFACE; 73382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 73482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].type = (VASurfaceAttribType)VASurfaceAttribMemoryType; 73582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].flags = VA_SURFACE_ATTRIB_SETTABLE; 73682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].value.type = VAGenericValueTypeInteger; 73782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].value.value.i = type; 73882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 73982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].type = (VASurfaceAttribType)VASurfaceAttribExternalBufferDescriptor; 74082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].flags = VA_SURFACE_ATTRIB_SETTABLE; 74182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].value.type = VAGenericValueTypePointer; 74282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].value.value.p = (void *)&extbuf; 74382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 74482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateSurfaces(mVADisplay, VA_RT_FORMAT_YUV420, vinfo.width, 74582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vinfo.height, &surface, 1, attribs, 2); 74682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (vaStatus != VA_STATUS_SUCCESS){ 74782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("vaCreateSurfaces failed. vaStatus = %d\n", vaStatus); 74882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON surface = VA_INVALID_SURFACE; 74982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } 75082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return surface; 75182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 75282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 75382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONVASurfaceID CreateNewVASurface(VADisplay display, int32_t width, int32_t height) { 75482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 75582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VAStatus vaStatus; 75682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceID surface = VA_INVALID_SURFACE; 75782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceAttrib attribs[2]; 75882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON VASurfaceAttribExternalBuffers extbuf; 75982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON unsigned long data; 76082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 76182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pixel_format = VA_FOURCC_NV12; 76282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.width = width; 76382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.height = height; 76482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.data_size = width * height * 3 / 2; 76582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.num_buffers = 1; 76682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.num_planes = 3; 76782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[0] = width; 76882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[1] = width; 76982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[2] = width; 77082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.pitches[3] = 0; 77182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[0] = 0; 77282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[1] = width * height; 77382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[2] = extbuf.offsets[1]; 77482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.offsets[3] = 0; 77582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.buffers = &data; 77682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.flags = 0; 77782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON extbuf.private_data = NULL; 77882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 77982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].type = (VASurfaceAttribType)VASurfaceAttribMemoryType; 78082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].flags = VA_SURFACE_ATTRIB_SETTABLE; 78182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].value.type = VAGenericValueTypeInteger; 78282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[0].value.value.i = VA_SURFACE_ATTRIB_MEM_TYPE_VA; 78382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 78482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].type = (VASurfaceAttribType)VASurfaceAttribExternalBufferDescriptor; 78582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].flags = VA_SURFACE_ATTRIB_SETTABLE; 78682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].value.type = VAGenericValueTypePointer; 78782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON attribs[1].value.value.p = (void *)&extbuf; 78882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 78982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON vaStatus = vaCreateSurfaces(display, VA_RT_FORMAT_YUV420, width, 79082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON height, &surface, 1, attribs, 2); 79182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON if (vaStatus != VA_STATUS_SUCCESS) 79282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LOG_E("vaCreateSurfaces failed. vaStatus = %d\n", vaStatus); 79382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 79482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON return surface; 79582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} 796