blob: e593c025b44f7665862083db7c478ad7f611f33b [file] [log] [blame]
/*
* 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;
}