You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.1 KiB
153 lines
4.1 KiB
/*
|
|
* Copyright Samsung Electronics Co.,LTD.
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/mman.h>
|
|
#include <fcntl.h>
|
|
|
|
#include <linux/videodev2.h>
|
|
#include <linux/v4l2-controls.h>
|
|
|
|
#include <exynos-hwjpeg.h>
|
|
#include "hwjpeg-internal.h"
|
|
|
|
CHWJpegBase::CHWJpegBase(const char *path)
|
|
: m_iFD(-1), m_uiDeviceCaps(0), m_uiAuxFlags(0)
|
|
{
|
|
m_iFD = open(path, O_RDWR);
|
|
if (m_iFD < 0)
|
|
ALOGERR("Failed to open '%s'", path);
|
|
}
|
|
|
|
CHWJpegBase::~CHWJpegBase()
|
|
{
|
|
if (m_iFD >= 0)
|
|
close(m_iFD);
|
|
}
|
|
|
|
void CHWJpegBase::SetAuxFlags(unsigned int auxflags)
|
|
{
|
|
ALOGW_IF(!!(m_uiAuxFlags & auxflags),
|
|
"Configuration auxiliary flags %#x overrides previous flags %#x",
|
|
auxflags , m_uiAuxFlags);
|
|
|
|
m_uiAuxFlags |= auxflags;
|
|
}
|
|
|
|
void CHWJpegBase::ClearAuxFlags(unsigned int auxflags)
|
|
{
|
|
|
|
ALOGW_IF(!!(m_uiAuxFlags & auxflags) && ((m_uiAuxFlags & auxflags) != auxflags),
|
|
"Clearing auxiliary flags %#x overrides previous flags %#x",
|
|
auxflags, m_uiAuxFlags);
|
|
|
|
m_uiAuxFlags &= ~auxflags;
|
|
}
|
|
|
|
bool CStopWatch::Start()
|
|
{
|
|
int ret = clock_gettime(CLOCK_MONOTONIC, &m_tBegin);
|
|
if (ret) {
|
|
ALOGERR("Failed to get current clock");
|
|
memset(&m_tBegin, 0, sizeof(m_tBegin));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
unsigned long CStopWatch::GetElapsed()
|
|
{
|
|
timespec tp;
|
|
int ret = clock_gettime(CLOCK_MONOTONIC, &tp);
|
|
if (ret) {
|
|
ALOGERR("Failed to get current clock");
|
|
return 0;
|
|
}
|
|
|
|
unsigned long elapsed = (tp.tv_sec - m_tBegin.tv_sec) * 1000000;
|
|
return (m_tBegin.tv_nsec > tp.tv_nsec)
|
|
? elapsed - (m_tBegin.tv_nsec - tp.tv_nsec) / 1000
|
|
: elapsed + (tp.tv_nsec - m_tBegin.tv_nsec) / 1000;
|
|
}
|
|
|
|
unsigned long CStopWatch::GetElapsedUpdate()
|
|
{
|
|
timespec tp;
|
|
int ret = clock_gettime(CLOCK_MONOTONIC, &tp);
|
|
if (ret) {
|
|
ALOGERR("Failed to get current clock");
|
|
return 0;
|
|
}
|
|
|
|
unsigned long elapsed = (tp.tv_sec - m_tBegin.tv_sec) * 1000000;
|
|
elapsed = (m_tBegin.tv_nsec > tp.tv_nsec)
|
|
? elapsed - (m_tBegin.tv_nsec - tp.tv_nsec) / 1000
|
|
: elapsed + (tp.tv_nsec - m_tBegin.tv_nsec) / 1000;
|
|
|
|
m_tBegin = tp;
|
|
return elapsed;
|
|
}
|
|
|
|
bool WriteToFile(const char *path, const char *data, size_t len)
|
|
{
|
|
int fd = open(path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH | S_IWGRP );
|
|
if (fd < 0) {
|
|
ALOGERR("Failed to open '%s' for write/create", path);
|
|
return false;
|
|
}
|
|
|
|
ssize_t written = write(fd, data, len);
|
|
close(fd);
|
|
if (written < 0) {
|
|
ALOGERR("Failed to write %zu bytes to '%s'", len, path);
|
|
return false;
|
|
}
|
|
|
|
ALOGI("%zu/%zu bytes from ptr %p are written to '%s'", written, len, data, path);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool WriteToFile(const char *path, int dmabuf, size_t len)
|
|
{
|
|
char *p = reinterpret_cast<char *>(mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, dmabuf, 0));
|
|
if (p == MAP_FAILED) {
|
|
ALOGERR("Filed to map the given dmabuf fd %d", dmabuf);
|
|
return false;
|
|
}
|
|
|
|
int fd = open(path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH | S_IWGRP );
|
|
if (fd < 0) {
|
|
ALOGERR("Failed to open '%s' for write/create", path);
|
|
munmap(p, len);
|
|
return false;
|
|
}
|
|
|
|
ssize_t written = write(fd, p, len);
|
|
if (written < 0)
|
|
ALOGERR("Failed to write %zu bytes to '%s'", len, path);
|
|
else
|
|
ALOGI("%zu/%zu bytes from dmabuf fd %d are written to '%s'", written, len, dmabuf, path);
|
|
|
|
munmap(p, len);
|
|
close(fd);
|
|
|
|
return true;
|
|
}
|