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 |
|
| `vagi` | SPU-ADPCM | Any | None | Any |
|
||||||
| `str2` | None or XA-ADPCM | 1 or 2 | BS v2 | 2336 bytes |
|
| `str2` | None or XA-ADPCM | 1 or 2 | BS v2 | 2336 bytes |
|
||||||
| `str2cd` | None or XA-ADPCM | 1 or 2 | BS v2 | 2352 bytes |
|
| `str2cd` | None or XA-ADPCM | 1 or 2 | BS v2 | 2352 bytes |
|
||||||
|
| `str2v` | None | | BS v2 | |
|
||||||
| `sbs2` | None | | BS v2 | Any |
|
| `sbs2` | None | | BS v2 | Any |
|
||||||
|
|
||||||
Notes:
|
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, 0, PSX_CDROM_SECTOR_SIZE);
|
||||||
memset(buffer->sync + 1, 0xFF, 10);
|
memset(buffer->sync + 1, 0xFF, 10);
|
||||||
buffer->header.mode = 0x02;
|
buffer->header.mode = 0x02;
|
||||||
|
} else if (settings->format == FORMAT_STR2V) {
|
||||||
|
memset(buffer->data, 0, 2048);
|
||||||
} else {
|
} else {
|
||||||
memset(buffer->subheader, 0, PSX_CDROM_SECTOR_SIZE - 16);
|
memset(buffer->subheader, 0, PSX_CDROM_SECTOR_SIZE - 16);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,16 +40,19 @@ freely, subject to the following restrictions:
|
||||||
#include <libswresample/swresample.h>
|
#include <libswresample/swresample.h>
|
||||||
#include <libpsxav.h>
|
#include <libpsxav.h>
|
||||||
|
|
||||||
#define NUM_FORMATS 9
|
typedef enum {
|
||||||
#define FORMAT_XA 0
|
FORMAT_XA,
|
||||||
#define FORMAT_XACD 1
|
FORMAT_XACD,
|
||||||
#define FORMAT_SPU 2
|
FORMAT_SPU,
|
||||||
#define FORMAT_SPUI 3
|
FORMAT_SPUI,
|
||||||
#define FORMAT_VAG 4
|
FORMAT_VAG,
|
||||||
#define FORMAT_VAGI 5
|
FORMAT_VAGI,
|
||||||
#define FORMAT_STR2 6
|
FORMAT_STR2,
|
||||||
#define FORMAT_STR2CD 7
|
FORMAT_STR2CD,
|
||||||
#define FORMAT_SBS2 8
|
FORMAT_STR2V,
|
||||||
|
FORMAT_SBS2,
|
||||||
|
NUM_FORMATS
|
||||||
|
} psxavenc_format_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int frame_index;
|
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_xa_settings_t xa_settings = settings_to_libpsxav_xa_audio(settings);
|
||||||
psx_audio_encoder_state_t audio_state;
|
psx_audio_encoder_state_t audio_state;
|
||||||
int audio_samples_per_sector = psx_audio_xa_get_samples_per_sector(xa_settings);
|
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));
|
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) {
|
void encode_file_str(settings_t *settings, FILE *output) {
|
||||||
psx_audio_xa_settings_t xa_settings = settings_to_libpsxav_xa_audio(settings);
|
psx_audio_xa_settings_t xa_settings = settings_to_libpsxav_xa_audio(settings);
|
||||||
psx_audio_encoder_state_t audio_state;
|
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;
|
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 interleave;
|
||||||
int video_sectors_per_block;
|
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);
|
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;
|
interleave = psx_audio_xa_get_sector_interleave(xa_settings) * settings->cd_speed;
|
||||||
video_sectors_per_block = interleave - 1;
|
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 {
|
} else {
|
||||||
// 0/1 audio, 1/1 video
|
// 0/1 audio, 1/1 video
|
||||||
audio_samples_per_sector = 0;
|
audio_samples_per_sector = 0;
|
||||||
|
@ -284,11 +297,6 @@ void encode_file_str(settings_t *settings, FILE *output) {
|
||||||
video_sectors_per_block = 1;
|
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));
|
memset(&audio_state, 0, sizeof(psx_audio_encoder_state_t));
|
||||||
|
|
||||||
// e.g. 15fps = (150*7/8/15) = 8.75 blocks per frame
|
// 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);
|
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);
|
time_t t = get_elapsed_time(settings);
|
||||||
if (t) {
|
if (t) {
|
||||||
|
|
|
@ -29,7 +29,7 @@ const char *format_names[NUM_FORMATS] = {
|
||||||
"xa", "xacd",
|
"xa", "xacd",
|
||||||
"spu", "spui",
|
"spu", "spui",
|
||||||
"vag", "vagi",
|
"vag", "vagi",
|
||||||
"str2", "str2cd",
|
"str2", "str2cd", "str2v",
|
||||||
"sbs2"
|
"sbs2"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ void print_help(void) {
|
||||||
"Usage:\n"
|
"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 <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 <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 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 <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"
|
" 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"
|
" vagi [A.] .vag SPU-ADPCM interleaved\n"
|
||||||
" str2 [AV] v2 .str video, 2336-byte sectors\n"
|
" str2 [AV] v2 .str video, 2336-byte sectors\n"
|
||||||
" str2cd [AV] v2 .str video, 2352-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"
|
" sbs2 [.V] v2 .sbs video, 2048-byte sectors\n"
|
||||||
" -F num xa/str2: Set the XA file number\n"
|
" -F num xa/str2: Set the XA file number\n"
|
||||||
" 0-255, default 0\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_XACD:
|
||||||
case FORMAT_STR2:
|
case FORMAT_STR2:
|
||||||
case FORMAT_STR2CD:
|
case FORMAT_STR2CD:
|
||||||
|
case FORMAT_STR2V:
|
||||||
if (!settings->frequency) {
|
if (!settings->frequency) {
|
||||||
settings->frequency = PSX_AUDIO_XA_FREQ_DOUBLE;
|
settings->frequency = PSX_AUDIO_XA_FREQ_DOUBLE;
|
||||||
} else if (settings->frequency != PSX_AUDIO_XA_FREQ_SINGLE && 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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool has_audio = (settings.format != FORMAT_SBS2);
|
bool has_audio =
|
||||||
bool has_video = (settings.format == FORMAT_STR2) ||
|
(settings.format != FORMAT_STR2V) &&
|
||||||
(settings.format == FORMAT_STR2CD) || (settings.format == FORMAT_SBS2);
|
(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,
|
bool did_open_data = open_av_data(argv[arg_offset + 0], &settings,
|
||||||
has_audio, has_video, !has_video, has_video);
|
has_audio, has_video, !has_video, has_video);
|
||||||
|
@ -449,6 +457,7 @@ int main(int argc, char **argv) {
|
||||||
break;
|
break;
|
||||||
case FORMAT_STR2:
|
case FORMAT_STR2:
|
||||||
case FORMAT_STR2CD:
|
case FORMAT_STR2CD:
|
||||||
|
case FORMAT_STR2V:
|
||||||
if (!settings.quiet) {
|
if (!settings.quiet) {
|
||||||
if (settings.decoder_state_av.audio_stream) {
|
if (settings.decoder_state_av.audio_stream) {
|
||||||
fprintf(stderr, "Audio format: XA-ADPCM, %d Hz %d-bit %s, F=%d C=%d\n",
|
fprintf(stderr, "Audio format: XA-ADPCM, %d Hz %d-bit %s, F=%d C=%d\n",
|
||||||
|
|
Loading…
Reference in New Issue