Initial commit with working config functions

This commit is contained in:
Marko Viitanen 2012-05-30 15:10:23 +03:00
commit adce16c03f
8 changed files with 578 additions and 0 deletions

0
bin/placeholder.txt Normal file
View file

0
build/placeholder.txt Normal file
View file

9
doc/syntax_elements.txt Normal file
View file

@ -0,0 +1,9 @@
The following descriptors specify the parsing process of each syntax element.
ae(v): context-adaptive arithmetic entropy-coded syntax element. The parsing process for this descriptor is specified in subclause 9.2.
b(8): byte having any pattern of bit string (8 bits). The parsing process for this descriptor is specified by the return value of the function read_bits( 8 ).
f(n): fixed-pattern bit string using n bits written (from left to right) with the left bit first. The parsing process for this descriptor is specified by the return value of the function read_bits( n ).
i(n): signed integer using n bits. When n is "v" in the syntax table, the number of bits varies in a manner dependent on the value of other syntax elements. The parsing process for this descriptor is specified by the return value of the function read_bits( n ) interpreted as a two's complement integer representation with most significant bit written first.
se(v): signed integer Exp-Golomb-coded syntax element with the left bit first. The parsing process for this descriptor is specified in subclause 9.1.
tu(v): truncated unary coded syntax element with left bit first. The parsing process for this descriptor is specified in subclause 9.1.
u(n): unsigned integer using n bits. When n is "v" in the syntax table, the number of bits varies in a manner dependent on the value of other syntax elements. The parsing process for this descriptor is specified by the return value of the function read_bits( n ) interpreted as a binary representation of an unsigned integer with most significant bit written first.
ue(v): unsigned integer Exp-Golomb-coded syntax element with the left bit first. The parsing process for this descriptor is specified in subclause 9.1.

247
include/stdint.h Normal file
View file

@ -0,0 +1,247 @@
// ISO C9x compliant stdint.h for Microsoft Visual Studio
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
//
// Copyright (c) 2006-2008 Alexander Chemeris
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. The name of the author may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _MSC_VER // [
#error "Use this header only with Microsoft Visual C++ compilers!"
#endif // _MSC_VER ]
#ifndef _MSC_STDINT_H_ // [
#define _MSC_STDINT_H_
#if _MSC_VER > 1000
#pragma once
#endif
#include <limits.h>
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
// or compiler give many errors like this:
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
#ifdef __cplusplus
extern "C" {
#endif
# include <wchar.h>
#ifdef __cplusplus
}
#endif
// Define _W64 macros to mark types changing their size, like intptr_t.
#ifndef _W64
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
# define _W64 __w64
# else
# define _W64
# endif
#endif
// 7.18.1 Integer types
// 7.18.1.1 Exact-width integer types
// Visual Studio 6 and Embedded Visual C++ 4 doesn't
// realize that, e.g. char has the same size as __int8
// so we give up on __intX for them.
#if (_MSC_VER < 1300)
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#else
typedef signed __int8 int8_t;
typedef signed __int16 int16_t;
typedef signed __int32 int32_t;
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
#endif
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
// 7.18.1.2 Minimum-width integer types
typedef int8_t int_least8_t;
typedef int16_t int_least16_t;
typedef int32_t int_least32_t;
typedef int64_t int_least64_t;
typedef uint8_t uint_least8_t;
typedef uint16_t uint_least16_t;
typedef uint32_t uint_least32_t;
typedef uint64_t uint_least64_t;
// 7.18.1.3 Fastest minimum-width integer types
typedef int8_t int_fast8_t;
typedef int16_t int_fast16_t;
typedef int32_t int_fast32_t;
typedef int64_t int_fast64_t;
typedef uint8_t uint_fast8_t;
typedef uint16_t uint_fast16_t;
typedef uint32_t uint_fast32_t;
typedef uint64_t uint_fast64_t;
// 7.18.1.4 Integer types capable of holding object pointers
#ifdef _WIN64 // [
typedef signed __int64 intptr_t;
typedef unsigned __int64 uintptr_t;
#else // _WIN64 ][
typedef _W64 signed int intptr_t;
typedef _W64 unsigned int uintptr_t;
#endif // _WIN64 ]
// 7.18.1.5 Greatest-width integer types
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
// 7.18.2 Limits of specified-width integer types
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
// 7.18.2.1 Limits of exact-width integer types
#define INT8_MIN ((int8_t)_I8_MIN)
#define INT8_MAX _I8_MAX
#define INT16_MIN ((int16_t)_I16_MIN)
#define INT16_MAX _I16_MAX
#define INT32_MIN ((int32_t)_I32_MIN)
#define INT32_MAX _I32_MAX
#define INT64_MIN ((int64_t)_I64_MIN)
#define INT64_MAX _I64_MAX
#define UINT8_MAX _UI8_MAX
#define UINT16_MAX _UI16_MAX
#define UINT32_MAX _UI32_MAX
#define UINT64_MAX _UI64_MAX
// 7.18.2.2 Limits of minimum-width integer types
#define INT_LEAST8_MIN INT8_MIN
#define INT_LEAST8_MAX INT8_MAX
#define INT_LEAST16_MIN INT16_MIN
#define INT_LEAST16_MAX INT16_MAX
#define INT_LEAST32_MIN INT32_MIN
#define INT_LEAST32_MAX INT32_MAX
#define INT_LEAST64_MIN INT64_MIN
#define INT_LEAST64_MAX INT64_MAX
#define UINT_LEAST8_MAX UINT8_MAX
#define UINT_LEAST16_MAX UINT16_MAX
#define UINT_LEAST32_MAX UINT32_MAX
#define UINT_LEAST64_MAX UINT64_MAX
// 7.18.2.3 Limits of fastest minimum-width integer types
#define INT_FAST8_MIN INT8_MIN
#define INT_FAST8_MAX INT8_MAX
#define INT_FAST16_MIN INT16_MIN
#define INT_FAST16_MAX INT16_MAX
#define INT_FAST32_MIN INT32_MIN
#define INT_FAST32_MAX INT32_MAX
#define INT_FAST64_MIN INT64_MIN
#define INT_FAST64_MAX INT64_MAX
#define UINT_FAST8_MAX UINT8_MAX
#define UINT_FAST16_MAX UINT16_MAX
#define UINT_FAST32_MAX UINT32_MAX
#define UINT_FAST64_MAX UINT64_MAX
// 7.18.2.4 Limits of integer types capable of holding object pointers
#ifdef _WIN64 // [
# define INTPTR_MIN INT64_MIN
# define INTPTR_MAX INT64_MAX
# define UINTPTR_MAX UINT64_MAX
#else // _WIN64 ][
# define INTPTR_MIN INT32_MIN
# define INTPTR_MAX INT32_MAX
# define UINTPTR_MAX UINT32_MAX
#endif // _WIN64 ]
// 7.18.2.5 Limits of greatest-width integer types
#define INTMAX_MIN INT64_MIN
#define INTMAX_MAX INT64_MAX
#define UINTMAX_MAX UINT64_MAX
// 7.18.3 Limits of other integer types
#ifdef _WIN64 // [
# define PTRDIFF_MIN _I64_MIN
# define PTRDIFF_MAX _I64_MAX
#else // _WIN64 ][
# define PTRDIFF_MIN _I32_MIN
# define PTRDIFF_MAX _I32_MAX
#endif // _WIN64 ]
#define SIG_ATOMIC_MIN INT_MIN
#define SIG_ATOMIC_MAX INT_MAX
#ifndef SIZE_MAX // [
# ifdef _WIN64 // [
# define SIZE_MAX _UI64_MAX
# else // _WIN64 ][
# define SIZE_MAX _UI32_MAX
# endif // _WIN64 ]
#endif // SIZE_MAX ]
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
#ifndef WCHAR_MIN // [
# define WCHAR_MIN 0
#endif // WCHAR_MIN ]
#ifndef WCHAR_MAX // [
# define WCHAR_MAX _UI16_MAX
#endif // WCHAR_MAX ]
#define WINT_MIN 0
#define WINT_MAX _UI16_MAX
#endif // __STDC_LIMIT_MACROS ]
// 7.18.4 Limits of other integer types
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
// 7.18.4.1 Macros for minimum-width integer constants
#define INT8_C(val) val##i8
#define INT16_C(val) val##i16
#define INT32_C(val) val##i32
#define INT64_C(val) val##i64
#define UINT8_C(val) val##ui8
#define UINT16_C(val) val##ui16
#define UINT32_C(val) val##ui32
#define UINT64_C(val) val##ui64
// 7.18.4.2 Macros for greatest-width integer constants
#define INTMAX_C INT64_C
#define UINTMAX_C UINT64_C
#endif // __STDC_CONSTANT_MACROS ]
#endif // _MSC_STDINT_H_ ]

138
src/config.c Normal file
View file

@ -0,0 +1,138 @@
/**
* HEVC Encoder
* - Marko Viitanen ( fador at iki.fi ), Tampere University of Technology, Department of Computer Systems.
*/
/*! \file config.c
\brief Configuration related functions
\author Marko Viitanen
\date 2012-05
This file has all configuration related functions
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "global.h"
#include "config.h"
/*!
\brief Allocate memory for config object
\return pointer to allocated memory
*/
config* config_alloc()
{
config* cfg = (config *)malloc(sizeof(config));
memset(cfg, 0, sizeof(config));
return cfg;
}
/*!
\brief Initialize config structure
\param cfg config object
\return 1 on success, 0 on failure
*/
int config_init(config* cfg)
{
cfg->input = NULL;
cfg->output = NULL;
cfg->debug = NULL;
cfg->frames = 0;
cfg->skip = 0;
return 1;
}
/*!
\brief Free memory allocated to the config
\param cfg config object
\return 1 on success, 0 on failure
*/
int config_destroy(config* cfg)
{
if(cfg->input != NULL)
{
free(cfg->input);
cfg->input = NULL;
}
if(cfg->output != NULL)
{
free(cfg->output);
cfg->output = NULL;
}
free(cfg);
return 1;
}
/*!
\brief Read configuration options from argv to the config struct
\param cfg config object
\param argc argument count
\param argv argument list
\return 1 on success, 0 on failure
*/
int config_read(config* cfg,int argc, char* argv[])
{
uint32_t pos = 0;
int arg = 1;
char option = 0;
while(arg < argc && pos < strlen(argv[arg]))
{
/* Check for an option */
if(argv[arg][0] == '-' && strlen(argv[arg]) > 1)
{
/* Second letter of the argument is the option we want to use */
option = argv[arg][1];
/* Point to the next argument */
arg++;
switch(option)
{
case 'i': /* Input */
/* Allocate +1 for \0 */
cfg->input = malloc(strlen(argv[arg])+1);
memcpy(cfg->input, argv[arg], strlen(argv[arg])+1);
break;
case 'o': /* Output */
cfg->output = malloc(strlen(argv[arg])+1);
memcpy(cfg->output, argv[arg], strlen(argv[arg])+1);
break;
case 'd': /* Debug */
cfg->debug = malloc(strlen(argv[arg])+1);
memcpy(cfg->debug, argv[arg], strlen(argv[arg])+1);
break;
case 'w': /* width */
/* Get skipped frames count */
cfg->width = atoi(argv[arg]);
break;
case 'h': /* height */
/* Get skipped frames count */
cfg->height = atoi(argv[arg]);
break;
case 'n': /* Framecount */
/* Get frame count */
cfg->frames = atoi(argv[arg]);
break;
default:
/* Unknown command */
fprintf(stderr, "%c is not a known option\r\n", option);
break;
}
}
/* Next argument */
arg++;
}
/* Check that the required files were defined */
if(cfg->input == NULL || cfg->output == NULL)
{
return 0;
}
return 1;
}

36
src/config.h Normal file
View file

@ -0,0 +1,36 @@
/**
* HEVC Encoder
* - Marko Viitanen ( fador at iki.fi ), Tampere University of Technology, Department of Computer Systems.
*/
/*! \file config.h
\brief Configuration header
\author Marko Viitanen
\date 2012-05
Contains all configuration system related functions and structs
*/
#ifndef _CONFIG_H_
#define _CONFIG_H_
/*!
\brief Struct which contains all configuration data
*/
typedef struct
{
char *input; /*!< \brief Pointer to input filename */
char *output;/*!< \brief Pointer to output filename */
char *debug; /*!< \brief Pointer to debug output */
int frames; /*!< \brief Number of frames to decode */
int width; /*!< \brief frame width */
int height; /*!< \brief frame height */
} config;
/* Function definitions */
config* config_alloc();
int config_init(config* cfg);
int config_destroy(config* cfg);
int config_read(config* cfg,int argc, char* argv[]);
#endif

105
src/encmain.c Normal file
View file

@ -0,0 +1,105 @@
/**
* HEVC Encoder
* - Marko Viitanen ( fador at iki.fi ), Tampere University of Technology, Department of Computer Systems.
*/
/*! \file decmain.c
\brief main file for the Decoder
\author Marko Viitanen
\date 2012-05
This file contains main() function
*/
/*! \mainpage HEVC Encoder
*
* \section Coding style
*
* Coding style is explained in it's own document.
*
* \section usage_sec Usage
*
* \subsection encode_subsec Basic Decoding:
* Use encmain.exe -i input.yuv -o output.hevc
*
* \subsection options_subsec All program options:
* - -i <filename>: input
* - -o <filename>: output
* - -w <width>: frame width
* - -h <height>: frame height
* - -n <n>: encode only n frames
*/
/* Suppress some windows warnings */
#ifdef WIN32
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "global.h"
/*!
\brief Program main function.
\param argc Argument count from commandline
\param argv Argument list
\return Program exit state
*/
int main(int argc, char* argv[])
{
config *cfg = NULL; /* Global configuration */
FILE *input = NULL;
FILE *output = NULL;
/* Handle configuration */
cfg = config_alloc();
/* If problem with configuration, shutdown */
if(!config_init(cfg) || !config_read(cfg,argc,argv))
{
fprintf(stderr, "/////////////////////////////////////////////////\r\n");
fprintf(stderr, "// HEVC Encoder v. " VERSION_STRING "//\r\n");
fprintf(stderr, "// Tampere University of Technology 2012 //\r\n");
fprintf(stderr, "/////////////////////////////////////////////////\r\n\r\n");
fprintf(stderr, "Usage:\r\n");
fprintf(stderr, "encmain -i <input> -w <width> -h <height> -o <output>\r\n");
fprintf(stderr, "Optional parameters:\r\n");
fprintf(stderr, " -n <frames> : number of frames to decode\r\n");
fprintf(stderr, " -s <frames> : number of frames to skip from the beginning\r\n");
config_destroy(cfg);
return EXIT_FAILURE;
}
printf("Input: %s, output: %s\r\n", cfg->input, cfg->output);
/* Open input file and check that it was opened correctly */
input = fopen(cfg->input, "rb");
if(input == NULL)
{
fprintf(stderr, "Couldn't open input file!\r\n");
config_destroy(cfg);
return EXIT_FAILURE;
}
/* Open output file and check that it was opened correctly */
output = fopen(cfg->output, "wb");
if(output == NULL)
{
fprintf(stderr, "Couldn't open output file!\r\n");
config_destroy(cfg);
return EXIT_FAILURE;
}
fclose(input);
fclose(output);
config_destroy(cfg);
return EXIT_SUCCESS;
}

43
src/global.h Normal file
View file

@ -0,0 +1,43 @@
/**
* HEVC Encoder
* - Marko Viitanen ( fador at iki.fi ), Tampere University of Technology, Department of Computer Systems.
*/
/*! \file global.h
\brief Contains global includes
\author Marko Viitanen
\date 2012-05
This file should be included to every C-file.
*/
#ifndef __GLOBAL_H
#define __GLOBAL_H
//Including stdint.h,
#ifdef _MSC_VER
#include "../include/stdint.h"
#else
#include <stdint.h>
#endif
#define VERSION_STRING "0.1 "
#define VERSION 0.1
//#define VERBOSE 1
#define SIZE_2Nx2N 0
#define SIZE_2NxN 1
#define SIZE_Nx2N 2
#define SIZE_NxN 3
#define SIZE_NONE 15
#define MODE_SKIP 0
#define MODE_INTER 1
#define MODE_INTRA 2
#define MODE_NONE 15
#endif