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