diff --git a/README.md b/README.md index 57afdd5..411c595 100644 --- a/README.md +++ b/README.md @@ -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: diff --git a/psxavenc/cdrom.c b/psxavenc/cdrom.c index 17cfec4..d391e12 100644 --- a/psxavenc/cdrom.c +++ b/psxavenc/cdrom.c @@ -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); } diff --git a/psxavenc/common.h b/psxavenc/common.h index 343448a..6cf39f9 100644 --- a/psxavenc/common.h +++ b/psxavenc/common.h @@ -40,16 +40,19 @@ freely, subject to the following restrictions: #include #include -#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; diff --git a/psxavenc/filefmt.c b/psxavenc/filefmt.c index 247ca19..803ac2d 100644 --- a/psxavenc/filefmt.c +++ b/psxavenc/filefmt.c @@ -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) { diff --git a/psxavenc/psxavenc.c b/psxavenc/psxavenc.c index 89b58da..c64a49b 100644 --- a/psxavenc/psxavenc.c +++ b/psxavenc/psxavenc.c @@ -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 [-f 18900|37800] [-b 4|8] [-c 1|2] [-F 0-255] [-C 0-31] \n" " psxavenc -t [-f 18900|37800] [-b 4|8] [-c 1|2] [-F 0-255] [-C 0-31] [-s WxH] [-I] [-r num/den] [-x 1|2] \n" + " psxavenc -t str2v [-s WxH] [-I] [-r num/den] [-x 1|2] \n" " psxavenc -t sbs2 [-s WxH] [-I] [-r num/den] [-a size] \n" " psxavenc -t [-f freq] [-L] [-a size] \n" " psxavenc -t [-f freq] [-c 1-24] [-L] [-i size] [-a size] \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",