1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Redistribution and use in source and binary forms, with or without
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * modification, are permitted provided that the following conditions are
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * met:
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     * Redistributions of source code must retain the above copyright
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       notice, this list of conditions and the following disclaimer.
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     * Redistributions in binary form must reproduce the above
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       copyright notice, this list of conditions and the following
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       disclaimer in the documentation and/or other materials provided
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       with the distribution.
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     * Neither the name of The Linux Foundation nor the names of its
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       contributors may be used to endorse or promote products derived
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       from this software without specific prior written permission.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
30eff8db6f524a1390fa94dcdde5f3d827bf469e89Ray Zhang#include <errno.h>
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <string.h>
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/mman.h>
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/log.h>
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <gralloc_priv.h>
35a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#define __STDC_FORMAT_MACROS 1
36a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <inttypes.h>
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "qdMetaData.h"
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint setMetaData(private_handle_t *handle, DispParamType paramType,
40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                                    void *param) {
41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (!handle) {
42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s: Private handle is null!", __func__);
43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -1;
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (handle->fd_metadata == -1) {
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s: Bad fd for extra data!", __func__);
47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -1;
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (!param) {
50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s: input param is null!", __func__);
51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -1;
52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        handle->fd_metadata, 0);
56eff8db6f524a1390fa94dcdde5f3d827bf469e89Ray Zhang    if (base == reinterpret_cast<void*>(MAP_FAILED)) {
57eff8db6f524a1390fa94dcdde5f3d827bf469e89Ray Zhang        ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -1;
59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    data->operation |= paramType;
62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch (paramType) {
63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case PP_PARAM_HSIC:
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            memcpy((void *)&data->hsicData, param, sizeof(HSICData_t));
65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case PP_PARAM_SHARPNESS:
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            data->sharpness = *((int32_t *)param);
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case PP_PARAM_VID_INTFC:
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            data->video_interface = *((int32_t *)param);
71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case PP_PARAM_INTERLACED:
73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            data->interlaced = *((int32_t *)param);
74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case PP_PARAM_IGC:
76ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            memcpy((void *)&data->igcData, param, sizeof(IGCData_t));
77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case PP_PARAM_SHARP2:
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            memcpy((void *)&data->Sharp2Data, param, sizeof(Sharp2Data_t));
80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case PP_PARAM_TIMESTAMP:
82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            data->timestamp = *((int64_t *)param);
83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case UPDATE_BUFFER_GEOMETRY:
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            memcpy((void *)&data->bufferDim, param, sizeof(BufferDim_t));
86a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        break;
87a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case UPDATE_COLOR_SPACE:
88a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            data->colorSpace = *((ColorSpace_t *)param);
89a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        default:
91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("Unknown paramType %d", paramType);
92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(munmap(base, size))
95a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                                                        errno);
97ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
99