153 lines
6.0 KiB
C++
153 lines
6.0 KiB
C++
/*
|
|
* Copyright Samsung Electronics Co.,LTD.
|
|
* Copyright (C) 2010 The Android Open Source Project
|
|
* Copyright (C) 2011-2017 Intel Corporation
|
|
* Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd
|
|
*
|
|
* 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.
|
|
*
|
|
* JPEG DRIVER MODULE (JpegEncoder.h)
|
|
* Author : ge.lee -- initial version
|
|
* Date : 03 June 2010
|
|
* Purpose : This file implements the JPEG encoder APIs as needed by Camera HAL
|
|
*/
|
|
|
|
#ifndef __EXIFCREATER_H__
|
|
#define __EXIFCREATER_H__
|
|
|
|
#include <stdint.h>
|
|
#include <sys/ioctl.h>
|
|
#include <stddef.h>
|
|
|
|
#include "Exif.h"
|
|
|
|
#define MAX_JPG_WIDTH 4352
|
|
#define MAX_JPG_HEIGHT 3264
|
|
#define MAX_JPG_RESOLUTION (MAX_JPG_WIDTH * MAX_JPG_HEIGHT)
|
|
|
|
#define MAX_JPG_THUMBNAIL_WIDTH 640
|
|
#define MAX_JPG_THUMBNAIL_HEIGHT 480
|
|
#define MAX_JPG_THUMBNAIL_RESOLUTION (MAX_JPG_THUMBNAIL_WIDTH * \
|
|
MAX_JPG_THUMBNAIL_HEIGHT)
|
|
|
|
#define MAX_RGB_WIDTH 800
|
|
#define MAX_RGB_HEIGHT 480
|
|
#define MAX_RGB_RESOLUTION (MAX_RGB_WIDTH * MAX_RGB_HEIGHT)
|
|
|
|
/*******************************************************************************/
|
|
/* define JPG & image memory */
|
|
/* memory area is 4k(PAGE_SIZE) aligned because of VirtualCopyEx() */
|
|
#define JPG_STREAM_BUF_SIZE \
|
|
((MAX_JPG_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
|
|
#define JPG_STREAM_THUMB_BUF_SIZE \
|
|
((MAX_JPG_THUMBNAIL_RESOLUTION / PAGE_SIZE + 1) * PAGE_SIZE)
|
|
#define JPG_FRAME_BUF_SIZE \
|
|
(((MAX_JPG_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
|
|
#define JPG_FRAME_THUMB_BUF_SIZE \
|
|
(((MAX_JPG_THUMBNAIL_RESOLUTION * 3) / PAGE_SIZE + 1) * PAGE_SIZE)
|
|
#define JPG_RGB_BUF_SIZE \
|
|
(((MAX_RGB_RESOLUTION * 4) / PAGE_SIZE + 1) * PAGE_SIZE)
|
|
|
|
#define JPG_TOTAL_BUF_SIZE (JPG_STREAM_BUF_SIZE + \
|
|
JPG_STREAM_THUMB_BUF_SIZE + \
|
|
JPG_FRAME_BUF_SIZE + \
|
|
JPG_FRAME_THUMB_BUF_SIZE + \
|
|
JPG_RGB_BUF_SIZE)
|
|
|
|
#define JPG_MAIN_START 0x00
|
|
#define JPG_THUMB_START JPG_STREAM_BUF_SIZE
|
|
#define IMG_MAIN_START (JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE)
|
|
#define IMG_THUMB_START (IMG_MAIN_START + JPG_FRAME_BUF_SIZE)
|
|
/*******************************************************************************/
|
|
|
|
NAMESPACE_DECLARATION {
|
|
const char MAKERNOTE_ID[] = {
|
|
/* "RockchipMknote\0" */
|
|
0x52, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x69, 0x70,
|
|
0x4d, 0x6b, 0x6e, 0x6f, 0x74, 0x65, 0x0,
|
|
};
|
|
|
|
const unsigned SIZEOF_LENGTH_FIELD = 2;
|
|
const unsigned SIZEOF_APP2_MARKER = 2;
|
|
const unsigned SIZEOF_APP2_OVERHEAD = sizeof(MAKERNOTE_ID) + SIZEOF_APP2_MARKER + SIZEOF_LENGTH_FIELD;
|
|
|
|
typedef enum {
|
|
EXIF_FAIL = -1,
|
|
EXIF_SUCCESS = 0
|
|
} exif_status;
|
|
|
|
class ExifCreater {
|
|
public:
|
|
ExifCreater();
|
|
virtual ~ExifCreater();
|
|
|
|
exif_status setThumbData(const void *thumbBuf, unsigned int thumbSize);
|
|
|
|
bool isThumbDataSet() const;
|
|
|
|
exif_status makeExif(void *exifOut,
|
|
exif_attribute_t *exifInfo,
|
|
size_t *size);
|
|
|
|
exif_status makeExifInPlace(unsigned char *bufferStartAddr,
|
|
unsigned char *dqtAddr,
|
|
exif_attribute_t *exifInfo,
|
|
size_t jpegSize,
|
|
bool usePadding,
|
|
size_t &sizeWritten);
|
|
|
|
private:
|
|
exif_status makeApp2(void* pStartApp2, size_t& size, exif_attribute_t *exifInfo, bool writeId = true);
|
|
void writeMarkerSizeToBuf(unsigned char *ptrTo, unsigned int size);
|
|
/*
|
|
Every IFD has 12Bytes.
|
|
Tag ID, 2B; Type, 2B; Count, 4B; Value/Offset, 4B;
|
|
If it is Value, please use the first two functions.
|
|
If it is Offset, please use the last two functions
|
|
and store the data in the rear.
|
|
*/
|
|
void writeExifIfd(unsigned char **pCur,
|
|
unsigned short tag,
|
|
unsigned short type,
|
|
unsigned int count,
|
|
uint32_t value);
|
|
void writeExifIfd(unsigned char **pCur,
|
|
unsigned short tag,
|
|
unsigned short type,
|
|
unsigned int count,
|
|
unsigned char *pValue);
|
|
void writeExifIfd(unsigned char **pCur,
|
|
unsigned short tag,
|
|
unsigned short type,
|
|
unsigned int count,
|
|
rational_t *pValue,
|
|
unsigned int *offset,
|
|
unsigned char *start);
|
|
void writeExifIfd(unsigned char **pCur,
|
|
unsigned short tag,
|
|
unsigned short type,
|
|
unsigned int count,
|
|
unsigned char *pValue,
|
|
unsigned int *offset,
|
|
unsigned char *start);
|
|
void writeThumbData(unsigned char *pIfdStart,
|
|
unsigned char *pNextIfdOffset,
|
|
unsigned int *LongerTagOffset,
|
|
exif_attribute_t *exifInfo);
|
|
|
|
unsigned char * m_thumbBuf; // MAP: Added to set thumbnail from external data
|
|
unsigned int m_thumbSize; // MAP: Added to set thumbnail from external data
|
|
};
|
|
} NAMESPACE_DECLARATION_END
|
|
#endif /* __EXIFCREATER_H__ */
|