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.
267 lines
7.3 KiB
267 lines
7.3 KiB
/*
|
|
* test-ratiocodes.c -- testsuite for to/from ratio utility conversion
|
|
* functions. Everyone feel free to add more tests
|
|
* and improve existing ones.
|
|
* (C) 2006-2010 - Francesco Romani <fromani -at- gmail -dot- com>
|
|
*
|
|
* This file is part of transcode, a video stream processing tool.
|
|
*
|
|
* transcode is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* transcode is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "config.h"
|
|
#include "tc_defaults.h"
|
|
#include "libtc/libtc.h"
|
|
#include "libtc/ratiocodes.h"
|
|
|
|
#ifndef PACKAGE
|
|
#define PACKAGE __FILE__
|
|
#endif
|
|
|
|
#define DELTA (0.0005)
|
|
|
|
static int test_autoloop_from_fps(double fps)
|
|
{
|
|
int ret = 0, frc;
|
|
double myfps;
|
|
|
|
ret = tc_frc_code_from_value(&frc, fps);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "from_fps: failed conversion_from for fps=%f",
|
|
fps);
|
|
return 1;
|
|
}
|
|
|
|
ret = tc_frc_code_to_value(frc, &myfps);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "from_fps: failed conversion_to for fps=%f",
|
|
fps);
|
|
return 2;
|
|
}
|
|
|
|
if (myfps - DELTA < fps && fps < myfps + DELTA) {
|
|
tc_log_msg(PACKAGE, "from_fps: test for fps=%f -> OK",
|
|
fps);
|
|
} else {
|
|
tc_log_warn(PACKAGE, "from_fps: test for fps=%f -> FAILED (%f)",
|
|
fps, myfps);
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static int test_autoloop_to_fps(int frc)
|
|
{
|
|
int ret = 0, myfrc;
|
|
double fps;
|
|
|
|
ret = tc_frc_code_to_value(frc, &fps);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "to_fps: failed conversion_to for frc=%i",
|
|
frc);
|
|
return 1;
|
|
}
|
|
|
|
ret = tc_frc_code_from_value(&myfrc, fps);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "to_fps: failed conversion_from for frc=%i",
|
|
frc);
|
|
return 2;
|
|
}
|
|
|
|
if (frc == myfrc) {
|
|
tc_log_msg(PACKAGE, "to_fps: test for frc=%i -> OK", frc);
|
|
} else {
|
|
tc_log_warn(PACKAGE, "to_fps: test for frc=%i -> FAILED (%i)",
|
|
frc, myfrc);
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static int test_autoloop_to_ratio(int dom, int code)
|
|
{
|
|
int ret = 0, mycode;
|
|
TCPair pair;
|
|
|
|
ret = tc_code_to_ratio(dom, code, &pair.a, &pair.b);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "to_ratio: failed conversion_to for "
|
|
"code=%i (dom=%i)", code, dom);
|
|
return 1;
|
|
}
|
|
|
|
ret = tc_code_from_ratio(dom, &mycode, pair.a, pair.b);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "to_ratio: failed conversion_from for "
|
|
"code=%i (dom=%i)", code, dom);
|
|
return 2;
|
|
}
|
|
|
|
if (code == mycode) {
|
|
tc_log_msg(PACKAGE, "to_ratio: test for code=%i (dom=%i) -> OK",
|
|
code, dom);
|
|
} else {
|
|
tc_log_warn(PACKAGE, "to_ratio: test for code=%i (dom=%i) -> FAILED"
|
|
" (%i)", code, dom, mycode);
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static int test_autoloop_from_ratio(int dom, TCPair pair)
|
|
{
|
|
int ret = 0, code;
|
|
TCPair mypair;
|
|
|
|
ret = tc_code_from_ratio(dom, &code, pair.a, pair.b);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "from_ratio: failed conversion_from for "
|
|
"ratio=%i/%i (dom=%i)", pair.a, pair.b, dom);
|
|
return 2;
|
|
}
|
|
|
|
ret = tc_code_to_ratio(dom, code, &mypair.a, &mypair.b);
|
|
if (ret == TC_NULL_MATCH) {
|
|
tc_log_warn(PACKAGE, "from_ratio: failed conversion_to for "
|
|
"ratio=%i/%i (dom=%i)", pair.a, pair.b, dom);
|
|
return 1;
|
|
}
|
|
|
|
if (pair.a == mypair.a && pair.b == mypair.b) {
|
|
tc_log_msg(PACKAGE, "from_ratio: test for ratio=%i/%i (dom=%i)"
|
|
" -> OK", pair.a, pair.b, dom);
|
|
} else {
|
|
tc_log_warn(PACKAGE, "from_ratio: test for ratio=%i/%i (dom=%i)"
|
|
" -> FAILED (%i/%i)", pair.a, pair.b, dom,
|
|
mypair.a, mypair.b);
|
|
ret = -1;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
struct p_struct {
|
|
int code;
|
|
TCPair ratio;
|
|
};
|
|
|
|
/* intentionally random order */
|
|
static const struct p_struct frc_ratios[] = {
|
|
{ 0, { 0 , 0 } },
|
|
{ 10, { 5000, 1000 } },
|
|
{ 4, { 30000, 1001 } },
|
|
{ 2, { 24000, 1000 } },
|
|
{ 3, { 25000, 1000 } },
|
|
{ 9, { 1000, 1000 } },
|
|
{ 6, { 50000, 1000 } },
|
|
{ 11, { 10000, 1000 } },
|
|
{ 5, { 30000, 1000 } },
|
|
{ 8, { 60000, 1000 } },
|
|
{ 1, { 24000, 1001 } },
|
|
{ 12, { 12000, 1000 } },
|
|
{ 7, { 60000, 1001 } },
|
|
{ 13, { 15000, 1000 } },
|
|
};
|
|
|
|
/* intentionally random order */
|
|
static const struct p_struct asr_ratios[] = {
|
|
{ 2, { 4, 3 } },
|
|
{ 3, { 16, 9 } },
|
|
{ 1, { 1, 1 } },
|
|
{ 0, { 0, 0 } },
|
|
{ 4, { 221, 100 } },
|
|
};
|
|
|
|
/* intentionally random order */
|
|
static const struct p_struct par_ratios[] = {
|
|
{ 3, { 1000, 1100 } },
|
|
{ 0, { 1, 1 } },
|
|
{ 5, { 4000, 3300 } },
|
|
{ 4, { 1600, 1100 } },
|
|
{ 2, { 1200, 1100 } },
|
|
};
|
|
|
|
|
|
struct fr_struct {
|
|
int frc;
|
|
double fps;
|
|
};
|
|
|
|
/*
|
|
* testing frc/fps pairs, picked not-so-randomly, but
|
|
* intentionally left in random order here
|
|
*/
|
|
static const struct fr_struct fps_pairs[] = {
|
|
{ 7, (2*NTSC_VIDEO) },
|
|
{ 8, 60.0 },
|
|
{ 1, NTSC_FILM },
|
|
{ 4, NTSC_VIDEO },
|
|
{ 0, 0.0 },
|
|
{ 13, 15 },
|
|
{ 3, 25.0 },
|
|
// { 15, 0 },
|
|
// known issue: aliasing isn't handled properly
|
|
};
|
|
|
|
|
|
#define TABLE_LEN(tab) (sizeof((tab))/sizeof((tab)[0]))
|
|
|
|
int main(void)
|
|
{
|
|
int i = 0;
|
|
|
|
tc_log_info(PACKAGE, "testing frc <=> fps ...");
|
|
for (i = 0; i < TABLE_LEN(fps_pairs); i++) {
|
|
test_autoloop_from_fps(fps_pairs[i].fps);
|
|
test_autoloop_to_fps(fps_pairs[i].frc);
|
|
}
|
|
|
|
tc_log_info(PACKAGE, "testing frc <=> ratio ...");
|
|
for (i = 0; i < TABLE_LEN(frc_ratios); i++) {
|
|
test_autoloop_from_ratio(TC_FRC_CODE, frc_ratios[i].ratio);
|
|
test_autoloop_to_ratio(TC_FRC_CODE, frc_ratios[i].code);
|
|
}
|
|
|
|
tc_log_info(PACKAGE, "testing asr <=> ratio ...");
|
|
for (i = 0; i < TABLE_LEN(asr_ratios); i++) {
|
|
test_autoloop_from_ratio(TC_ASR_CODE, asr_ratios[i].ratio);
|
|
test_autoloop_to_ratio(TC_ASR_CODE, asr_ratios[i].code);
|
|
}
|
|
|
|
tc_log_info(PACKAGE, "testing par <=> ratio ...");
|
|
for (i = 0; i < TABLE_LEN(par_ratios); i++) {
|
|
test_autoloop_from_ratio(TC_PAR_CODE, par_ratios[i].ratio);
|
|
test_autoloop_to_ratio(TC_PAR_CODE, par_ratios[i].code);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*************************************************************************/
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-file-style: "stroustrup"
|
|
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*
|
|
* vim: expandtab shiftwidth=4:
|
|
*/
|