singe/ldp-out/framemod.cpp
2019-11-11 14:53:02 -06:00

216 lines
5.3 KiB
C++

/*
* framemod.cpp
*
* Copyright (C) 2001 Matt Ownby
*
* This file is part of DAPHNE, a laserdisc arcade game emulator
*
* DAPHNE 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.
*
* DAPHNE 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// framemod.cpp
// by Matt Ownby
// contains functions to convert the regular DL/SA NTSC frames to other formats such as PAL
#include "framemod.h"
#include "../daphne.h" // for get_frame_modifer
#include "../io/conout.h"
// returns 0 if no frame conversion is needed, else it returns a 1
bool need_frame_conversion()
{
// if we are using a search offset, a SA91 disc, or PAL,
// return non-zero
return( (get_search_offset() != 0) || (get_frame_modifier() != MOD_NONE));
}
// returns the Frames Per Kilosecond of the target disc that we are converting frames to
unsigned int get_frame_conversion_fpks()
{
unsigned int uResult = 0;
switch (get_frame_modifier())
{
case MOD_SA91:
uResult = 29970;
break;
case MOD_PAL_DL:
case MOD_PAL_SA:
case MOD_PAL_DL_SC:
case MOD_PAL_SA_SC:
uResult = 25000;
break;
default:
printline("Error in get_frame_conversion_fpks, no frame modifier is enabled");
break;
};
return uResult;
}
// converts a standard DL/SA '83 NTSC frame to PAL, Space Ace'91, etc ...
// the resulting frame is returned
Uint32 do_frame_conversion(int source_frame)
{
double result_frame = (double) source_frame; // it needs to be a float for precise math
int search_offset = get_search_offset();
result_frame = result_frame + search_offset; // apply any existing search offsets
// if we are using space ace 91 we need to convert from 24 FPS to 30 FPS and add a time constant
if (get_frame_modifier() == MOD_SA91)
{
// if the frame in question is one of the slides at the beginning,
// we need to do a more thought-out conversion
if (result_frame <= 145)
{
// frames 40 through 75
if ((result_frame >= 40) && (result_frame <= 75))
{
result_frame = 151;
}
// frames 112 through 139
else if ((result_frame >= 112) && (result_frame <= 139))
{
result_frame = 151;
}
else
{
switch ( (int) result_frame)
{
case 37:
case 38:
case 39:
result_frame = 145;
break;
case 76:
case 77:
case 78:
result_frame = 169;
break;
case 79:
case 80:
case 81:
result_frame = 175;
break;
case 82:
case 83:
case 84:
case 85:
case 86:
case 87:
result_frame = 217;
break;
case 88:
case 89:
case 90:
result_frame = 121;
break;
case 91:
case 92:
case 93:
case 94:
case 95:
case 96:
case 100:
case 101:
case 102:
result_frame = 151;
break;
case 97:
case 98:
case 99:
case 142:
case 143:
case 144:
case 145:
result_frame = 145;
break;
// if there is no good match, just use space ace logo
default:
result_frame = 1;
} // end switch
}
}
// if frame to be modified is greater than 145
else
{
result_frame = result_frame / 23.976; // convert frames to seconds
result_frame += 7.80807717679; // add time difference between SA '83 and SA '91
result_frame *= 29.97; // convert seconds to SA91 frames
result_frame += 0.5; // add 0.5 so when truncating, the average becomes the resulting frame
}
} // end if Space Ace 91
// regular Dragon's Lair PAL conversion
else if (get_frame_modifier() == MOD_PAL_DL)
{
result_frame = result_frame - 152;
// catch potential error
if (result_frame < 1)
{
result_frame = 1;
printline("NOTE: NTSC frame requested is not available on PAL DL disc");
}
}
// Space Ace PAL conversion
else if (get_frame_modifier() == MOD_PAL_SA)
{
result_frame = result_frame * (25.0 / 23.976); // convert NTSC frames to PAL frames
// NTSC and PAL discs have a 1:1 time correspondance
result_frame += 0.5; // add 0.5 so when truncating, the average becomes the resulting frame
}
// Dragon's Lair PAL for the Software Corner conversion
else if (get_frame_modifier() == MOD_PAL_DL_SC)
{
result_frame = result_frame - 230;
// catch potential error
if (result_frame < 1)
{
result_frame = 1;
printline("NOTE: NTSC frame requested is not available on DL Software Corner disc");
}
}
// Space Ace PAL Software Corner conversion
else if (get_frame_modifier() == MOD_PAL_SA_SC)
{
result_frame = result_frame * (25.0 / 23.976); // convert NTSC frames to PAL frames
// NTSC and PAL '83 Space Ace discs have a 1:1 time correspondance
result_frame += 79.5;
// Software Corner disc has 79 extra frames than PAL Space Ace
// add 0.5 to round to the nearest whole number when truncating
}
// bug catcher
else
{
printline("Bug in framemod.cpp, unknown frame modifier!");
}
return( (Uint32) result_frame);
}