Add str2v format

This commit is contained in:
Adrian Siekierka 2025-02-16 16:09:17 +01:00
parent 302989badf
commit 744aab19e5
5 changed files with 46 additions and 23 deletions

View File

@ -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:

View File

@ -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);
}

View File

@ -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;

View File

@ -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) {

View File

@ -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",