Skip to content
Snippets Groups Projects
TestCFHD.cpp 35.1 KiB
Newer Older
dnewman-gpsw's avatar
dnewman-gpsw committed
/*! @file TestCFHD.cpp

*  @brief Exerciser and example for using the CineForm SDK
*
*  @version 1.0.0
*
*  (C) Copyright 2017 GoPro Inc (http://gopro.com/).
*
*  Licensed under either:
*  - Apache License, Version 2.0, http://www.apache.org/licenses/LICENSE-2.0  
*  - MIT license, http://opensource.org/licenses/MIT
*  at your option.
*
*  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 "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <emmintrin.h>		// SSE2 intrinsics, _mm_malloc
#ifdef __APPLE__
#include <sys/time.h>
#else
#include <time.h>
#endif
#include "CFHDDecoder.h"
#include "CFHDEncoder.h"
#include "CFHDMetadata.h"


dnewman-gpsw's avatar
dnewman-gpsw committed
#include "mp4reader.h"
dnewman-gpsw's avatar
dnewman-gpsw committed

#define QBIST_SEED				50
#define ENABLE_3D				0		//2D or 3D-stereoscope encodign

#define QBIST_UNIQUE			1  //slower, but each frame get unique art to encode
#define OUTPUT_CFHD				0
#define DO_DECODE				1
dnewman-gpsw's avatar
dnewman-gpsw committed

#define OUTPUT_3D_TYPE			STEREO3D_TYPE_DEFAULT	
dnewman-gpsw's avatar
dnewman-gpsw committed
#if DO_DECODE
  #define DO_PSNR				1
  #if DO_PSNR  
    #define DECODE_FORMAT		pixelFormat			// Current encoding format, PSNR needs match pixel formats
    #define PPM_EXPORT_BELOW	40
  #else
	#define DECODE_FORMAT		pixelFormat
    //#define DECODE_FORMAT   CFHD_PIXEL_FORMAT_RG48	// Specify a decode format, indepentent of encode type
    #define PPM_EXPORT_ALL	1
  #endif
#endif


#ifdef _DEBUG
#define MAX_DEC_FRAMES		1
#define MAX_ENC_FRAMES		50
#define MAX_QUAL_FRAMES		1
#define	POOL_THREADS		4
#define	POOL_QUEUE_LENGTH	8

#define FRAME_WIDTH			1920
#define FRAME_HEIGHT		1080
#define BASENAME_IN			"FRMD"
#define BASENAME_OUT		"OUTD"
#else
#define MAX_DEC_FRAMES		5
dnewman-gpsw's avatar
dnewman-gpsw committed
#define MAX_ENC_FRAMES		500
dnewman-gpsw's avatar
dnewman-gpsw committed
#define MAX_QUAL_FRAMES		10
#define	POOL_THREADS		16
#define	POOL_QUEUE_LENGTH	24

#define FRAME_WIDTH			1920
#define FRAME_HEIGHT		1080
#define BASENAME_IN			"FRM"
#define BASENAME_OUT		"OUT"
#endif

unsigned int TestPixelFormat[] =
{ 
	//8-bit YUV 422 - 0
	CFHD_PIXEL_FORMAT_YUY2,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	CFHD_PIXEL_FORMAT_2VUY,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	
	//16-bit YUV 422		
	CFHD_PIXEL_FORMAT_YU64,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//8-bit RGB (inverted)
	CFHD_PIXEL_FORMAT_RG24,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,  // Lower PSNR due to 4:2:2 subampling a 4:4:4 input.
	CFHD_PIXEL_FORMAT_RG24,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//8-bit RGBA - 4 (inverted)
	CFHD_PIXEL_FORMAT_BGRA,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,  // Lower PSNR due to 4:2:2 subampling a 4:4:4 input.
	CFHD_PIXEL_FORMAT_BGRA,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	CFHD_PIXEL_FORMAT_BGRA,			CFHD_ENCODED_FORMAT_RGBA_4444,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//8-bit RGBA - 4 (not-inverted)
	CFHD_PIXEL_FORMAT_BGRa,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,  // Lower PSNR due to 4:2:2 subampling a 4:4:4 input.
	CFHD_PIXEL_FORMAT_BGRa,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	CFHD_PIXEL_FORMAT_BGRa,			CFHD_ENCODED_FORMAT_RGBA_4444,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//10-bit RGB - 7 - TODO 10-bit RGB 
	CFHD_PIXEL_FORMAT_R210,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	CFHD_PIXEL_FORMAT_DPX0,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	CFHD_PIXEL_FORMAT_AB10,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	CFHD_PIXEL_FORMAT_AR10,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//16-bit RGB - 15
	CFHD_PIXEL_FORMAT_RG48,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,  // Lower PSNR due to 4:2:2 subampling a 4:4:4 input.
	CFHD_PIXEL_FORMAT_RG48,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//16-bit RGBA - 17 
	CFHD_PIXEL_FORMAT_B64A,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,  // Lower PSNR due to 4:2:2 subampling a 4:4:4 input.
	CFHD_PIXEL_FORMAT_B64A,			CFHD_ENCODED_FORMAT_RGB_444,		CFHD_ENCODING_QUALITY_FILMSCAN1,
	CFHD_PIXEL_FORMAT_B64A,			CFHD_ENCODED_FORMAT_RGBA_4444,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//10-bit YUV 422 - 2 - TODO support V210 in TestCFHD
//	CFHD_PIXEL_FORMAT_V210,			CFHD_ENCODED_FORMAT_YUV_422,		CFHD_ENCODING_QUALITY_FILMSCAN1,

	//12-bit(Packed) Bayer/Raw - TODO BYR4/5 in TestCFHD
//	CFHD_PIXEL_FORMAT_BYR5,			CFHD_ENCODED_FORMAT_BAYER,			CFHD_ENCODING_QUALITY_FILMSCAN1,
//	//16-bit Bayer/Raw
//	CFHD_PIXEL_FORMAT_BYR4,			CFHD_ENCODED_FORMAT_BAYER,			CFHD_ENCODING_QUALITY_FILMSCAN1,

	0
};


CFHD_DecodedResolution TestResolution[] =
{
	CFHD_DECODED_RESOLUTION_FULL,
	CFHD_DECODED_RESOLUTION_HALF,
	CFHD_DECODED_RESOLUTION_QUARTER,
	CFHD_DECODED_RESOLUTION_UNKNOWN  // Stop at this
};

CFHD_PixelFormat TestDecodeOnlyPixelFormat[] =
{
	CFHD_PIXEL_FORMAT_RG24,
	CFHD_PIXEL_FORMAT_BGRA,
	CFHD_PIXEL_FORMAT_YUY2,		
	CFHD_PIXEL_FORMAT_YU64,
	CFHD_PIXEL_FORMAT_RG48,
	CFHD_PIXEL_FORMAT_B64A,

	CFHD_PIXEL_FORMAT_R210,	
	CFHD_PIXEL_FORMAT_DPX0,	
	CFHD_PIXEL_FORMAT_AB10,	
	CFHD_PIXEL_FORMAT_AR10,		

	//10-bit YUV 422 - 2 - TODO support 
	//	CFHD_PIXEL_FORMAT_V210,		

	//12-bit(Packed) Bayer/Raw - TODO BY
	//	CFHD_PIXEL_FORMAT_BYR5,		
	//	//16-bit Bayer/Raw
	//	CFHD_PIXEL_FORMAT_BYR4,		

	CFHD_PIXEL_FORMAT_UNKNOWN  // Stop at this
};



double gettime(void)
{
#ifdef __APPLE__
	timeval ts;
	gettimeofday(&ts, NULL);
	return (double)ts.tv_sec + (double)ts.tv_usec / 1000000.0;
#else
	struct timespec ts;
	timespec_get(&ts, TIME_UTC);
	return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0;
#endif
}

void SDKVerion(CFHD_DecoderRef decoderRef, void *sampleBuffer, int sampleSize)
{
	int SDKverison = 0;
	int SAMPLEverison = 0;

	CFHD_GetSampleInfo(decoderRef,
		sampleBuffer,
		sampleSize,
		CFHD_SAMPLE_SDK_VERSION,
		(void *)&SDKverison,
		sizeof(SDKverison));
	CFHD_GetSampleInfo(decoderRef,
		sampleBuffer,
		sampleSize,
		CFHD_SAMPLE_ENCODE_VERSION,
		(void *)&SAMPLEverison,
		sizeof(SAMPLEverison));

	if (SDKverison)
		printf("SDK Version:  %d.%d.%d\n", SDKverison >> 16, (SDKverison >> 8) & 0xff, SDKverison & 0xff);
Loading
Loading full blame...