Add str2v format
This commit is contained in:
parent
302989badf
commit
744aab19e5
|
@ -57,6 +57,7 @@ $ psxavenc -t vagi -f 44100 -c 2 -L -i 8192 in.wav out.vag
|
|||
| `vagi` | SPU-ADPCM | Any | None | Any |
|
||||
| `str2` | None or XA-ADPCM | 1 or 2 | BS v2 | 2336 bytes |
|
||||
| `str2cd` | None or XA-ADPCM | 1 or 2 | BS v2 | 2352 bytes |
|
||||
| `str2v` | None | | BS v2 | |
|
||||
| `sbs2` | None | | BS v2 | Any |
|
||||
|
||||
Notes:
|
||||
|
|
|
@ -28,6 +28,8 @@ void init_sector_buffer_video(psx_cdrom_sector_mode2_t *buffer, settings_t *sett
|
|||
memset(buffer, 0, PSX_CDROM_SECTOR_SIZE);
|
||||
memset(buffer->sync + 1, 0xFF, 10);
|
||||
buffer->header.mode = 0x02;
|
||||
} else if (settings->format == FORMAT_STR2V) {
|
||||
memset(buffer->data, 0, 2048);
|
||||
} else {
|
||||
memset(buffer->subheader, 0, PSX_CDROM_SECTOR_SIZE - 16);
|
||||
}
|
||||
|
|
|
@ -40,16 +40,19 @@ freely, subject to the following restrictions:
|
|||
#include <libswresample/swresample.h>
|
||||
#include <libpsxav.h>
|
||||
|
||||
#define NUM_FORMATS 9
|
||||
#define FORMAT_XA 0
|
||||
#define FORMAT_XACD 1
|
||||
#define FORMAT_SPU 2
|
||||
#define FORMAT_SPUI 3
|
||||
#define FORMAT_VAG 4
|
||||
#define FORMAT_VAGI 5
|
||||
#define FORMAT_STR2 6
|
||||
#define FORMAT_STR2CD 7
|
||||
#define FORMAT_SBS2 8
|
||||
typedef enum {
|
||||
FORMAT_XA,
|
||||
FORMAT_XACD,
|
||||
FORMAT_SPU,
|
||||
FORMAT_SPUI,
|
||||
FORMAT_VAG,
|
||||
FORMAT_VAGI,
|
||||
FORMAT_STR2,
|
||||
FORMAT_STR2CD,
|
||||
FORMAT_STR2V,
|
||||
FORMAT_SBS2,
|
||||
NUM_FORMATS
|
||||
} psxavenc_format_t;
|
||||
|
||||
typedef struct {
|
||||
int frame_index;
|
||||
|
|
|
@ -229,7 +229,7 @@ void encode_file_xa(settings_t *settings, FILE *output) {
|
|||
psx_audio_xa_settings_t xa_settings = settings_to_libpsxav_xa_audio(settings);
|
||||
psx_audio_encoder_state_t audio_state;
|
||||
int audio_samples_per_sector = psx_audio_xa_get_samples_per_sector(xa_settings);
|
||||
uint8_t buffer[2352];
|
||||
uint8_t buffer[PSX_CDROM_SECTOR_SIZE];
|
||||
|
||||
memset(&audio_state, 0, sizeof(psx_audio_encoder_state_t));
|
||||
|
||||
|
@ -266,9 +266,17 @@ void encode_file_xa(settings_t *settings, FILE *output) {
|
|||
void encode_file_str(settings_t *settings, FILE *output) {
|
||||
psx_audio_xa_settings_t xa_settings = settings_to_libpsxav_xa_audio(settings);
|
||||
psx_audio_encoder_state_t audio_state;
|
||||
int sector_size = psx_audio_xa_get_buffer_size_per_sector(xa_settings);
|
||||
int audio_samples_per_sector;
|
||||
uint8_t buffer[2352];
|
||||
uint8_t buffer[PSX_CDROM_SECTOR_SIZE];
|
||||
|
||||
int offset, sector_size;
|
||||
if (settings->format == FORMAT_STR2V) {
|
||||
sector_size = 2048;
|
||||
offset = 0x18;
|
||||
} else {
|
||||
sector_size = psx_audio_xa_get_buffer_size_per_sector(xa_settings);
|
||||
offset = PSX_CDROM_SECTOR_SIZE - sector_size;
|
||||
}
|
||||
|
||||
int interleave;
|
||||
int video_sectors_per_block;
|
||||
|
@ -277,6 +285,11 @@ void encode_file_str(settings_t *settings, FILE *output) {
|
|||
audio_samples_per_sector = psx_audio_xa_get_samples_per_sector(xa_settings);
|
||||
interleave = psx_audio_xa_get_sector_interleave(xa_settings) * settings->cd_speed;
|
||||
video_sectors_per_block = interleave - 1;
|
||||
|
||||
if (!settings->quiet) {
|
||||
fprintf(stderr, "Interleave: %d/%d audio, %d/%d video\n",
|
||||
interleave - video_sectors_per_block, interleave, video_sectors_per_block, interleave);
|
||||
}
|
||||
} else {
|
||||
// 0/1 audio, 1/1 video
|
||||
audio_samples_per_sector = 0;
|
||||
|
@ -284,11 +297,6 @@ void encode_file_str(settings_t *settings, FILE *output) {
|
|||
video_sectors_per_block = 1;
|
||||
}
|
||||
|
||||
if (!settings->quiet) {
|
||||
fprintf(stderr, "Interleave: %d/%d audio, %d/%d video\n",
|
||||
interleave - video_sectors_per_block, interleave, video_sectors_per_block, interleave);
|
||||
}
|
||||
|
||||
memset(&audio_state, 0, sizeof(psx_audio_encoder_state_t));
|
||||
|
||||
// e.g. 15fps = (150*7/8/15) = 8.75 blocks per frame
|
||||
|
@ -349,7 +357,7 @@ void encode_file_str(settings_t *settings, FILE *output) {
|
|||
calculate_edc_data(buffer);
|
||||
}
|
||||
|
||||
fwrite(buffer + 2352 - sector_size, sector_size, 1, output);
|
||||
fwrite(buffer + offset, sector_size, 1, output);
|
||||
|
||||
time_t t = get_elapsed_time(settings);
|
||||
if (t) {
|
||||
|
|
|
@ -29,7 +29,7 @@ const char *format_names[NUM_FORMATS] = {
|
|||
"xa", "xacd",
|
||||
"spu", "spui",
|
||||
"vag", "vagi",
|
||||
"str2", "str2cd",
|
||||
"str2", "str2cd", "str2v",
|
||||
"sbs2"
|
||||
};
|
||||
|
||||
|
@ -38,6 +38,7 @@ void print_help(void) {
|
|||
"Usage:\n"
|
||||
" psxavenc -t <xa|xacd> [-f 18900|37800] [-b 4|8] [-c 1|2] [-F 0-255] [-C 0-31] <in> <out.xa>\n"
|
||||
" psxavenc -t <str2|str2cd> [-f 18900|37800] [-b 4|8] [-c 1|2] [-F 0-255] [-C 0-31] [-s WxH] [-I] [-r num/den] [-x 1|2] <in> <out.str>\n"
|
||||
" psxavenc -t str2v [-s WxH] [-I] [-r num/den] [-x 1|2] <in> <out.str>\n"
|
||||
" psxavenc -t sbs2 [-s WxH] [-I] [-r num/den] [-a size] <in> <out.str>\n"
|
||||
" psxavenc -t <spu|vag> [-f freq] [-L] [-a size] <in> <out.vag>\n"
|
||||
" psxavenc -t <spui|vagi> [-f freq] [-c 1-24] [-L] [-i size] [-a size] <in> <out.vag>\n"
|
||||
|
@ -56,6 +57,7 @@ void print_help(void) {
|
|||
" vagi [A.] .vag SPU-ADPCM interleaved\n"
|
||||
" str2 [AV] v2 .str video, 2336-byte sectors\n"
|
||||
" str2cd [AV] v2 .str video, 2352-byte sectors\n"
|
||||
" str2v [.V] v2 .str video file\n"
|
||||
" sbs2 [.V] v2 .sbs video, 2048-byte sectors\n"
|
||||
" -F num xa/str2: Set the XA file number\n"
|
||||
" 0-255, default 0\n"
|
||||
|
@ -250,6 +252,7 @@ int parse_args(settings_t* settings, int argc, char** argv) {
|
|||
case FORMAT_XACD:
|
||||
case FORMAT_STR2:
|
||||
case FORMAT_STR2CD:
|
||||
case FORMAT_STR2V:
|
||||
if (!settings->frequency) {
|
||||
settings->frequency = PSX_AUDIO_XA_FREQ_DOUBLE;
|
||||
} else if (settings->frequency != PSX_AUDIO_XA_FREQ_SINGLE && settings->frequency != PSX_AUDIO_XA_FREQ_DOUBLE) {
|
||||
|
@ -394,9 +397,14 @@ int main(int argc, char **argv) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
bool has_audio = (settings.format != FORMAT_SBS2);
|
||||
bool has_video = (settings.format == FORMAT_STR2) ||
|
||||
(settings.format == FORMAT_STR2CD) || (settings.format == FORMAT_SBS2);
|
||||
bool has_audio =
|
||||
(settings.format != FORMAT_STR2V) &&
|
||||
(settings.format != FORMAT_SBS2);
|
||||
bool has_video =
|
||||
(settings.format == FORMAT_STR2) ||
|
||||
(settings.format == FORMAT_STR2CD) ||
|
||||
(settings.format == FORMAT_STR2V) ||
|
||||
(settings.format == FORMAT_SBS2);
|
||||
|
||||
bool did_open_data = open_av_data(argv[arg_offset + 0], &settings,
|
||||
has_audio, has_video, !has_video, has_video);
|
||||
|
@ -449,6 +457,7 @@ int main(int argc, char **argv) {
|
|||
break;
|
||||
case FORMAT_STR2:
|
||||
case FORMAT_STR2CD:
|
||||
case FORMAT_STR2V:
|
||||
if (!settings.quiet) {
|
||||
if (settings.decoder_state_av.audio_stream) {
|
||||
fprintf(stderr, "Audio format: XA-ADPCM, %d Hz %d-bit %s, F=%d C=%d\n",
|
||||
|
|
Loading…
Reference in New Issue