diff --git a/src/formats.c b/src/formats.c index d6d58626..34f22191 100644 --- a/src/formats.c +++ b/src/formats.c @@ -369,6 +369,7 @@ static const char* extension_list[] = { //"ogg", //common "ogl", + "ogv", "oma", //FFmpeg/not parsed (ATRAC3/ATRAC3PLUS/MP3/LPCM/WMA) "omu", //"opus", //common @@ -1348,6 +1349,7 @@ static const meta_info meta_info_list[] = { {meta_TAC, "tri-Ace Codec header"}, {meta_IDSP_TOSE, "TOSE .IDSP header"}, {meta_DSP_KWA, "Kuju London .KWA header"}, + {meta_OGV_3RDEYE, "3rdEye .OGV header"}, }; void get_vgmstream_coding_description(VGMSTREAM* vgmstream, char* out, size_t out_size) { diff --git a/src/libvgmstream.vcproj b/src/libvgmstream.vcproj index f4711c46..c319b23b 100644 --- a/src/libvgmstream.vcproj +++ b/src/libvgmstream.vcproj @@ -1154,6 +1154,10 @@ RelativePath=".\meta\ogl.c" > + + diff --git a/src/libvgmstream.vcxproj b/src/libvgmstream.vcxproj index a3ef4cbe..80345dee 100644 --- a/src/libvgmstream.vcxproj +++ b/src/libvgmstream.vcxproj @@ -421,6 +421,7 @@ + diff --git a/src/libvgmstream.vcxproj.filters b/src/libvgmstream.vcxproj.filters index b4e6be52..092b354e 100644 --- a/src/libvgmstream.vcxproj.filters +++ b/src/libvgmstream.vcxproj.filters @@ -760,6 +760,9 @@ meta\Source Files + + meta\Source Files + meta\Source Files diff --git a/src/meta/meta.h b/src/meta/meta.h index aa9d6812..3f5ba1f6 100644 --- a/src/meta/meta.h +++ b/src/meta/meta.h @@ -949,4 +949,6 @@ VGMSTREAM* init_vgmstream_mjb_mjh(STREAMFILE* sf); VGMSTREAM* init_vgmstream_tac(STREAMFILE* sf); +VGMSTREAM* init_vgmstream_ogv_3rdeye(STREAMFILE* sf); + #endif /*_META_H*/ diff --git a/src/meta/ogg_vorbis.c b/src/meta/ogg_vorbis.c index b62f1dad..e852508c 100644 --- a/src/meta/ogg_vorbis.c +++ b/src/meta/ogg_vorbis.c @@ -583,6 +583,8 @@ VGMSTREAM* init_vgmstream_ogg_vorbis_callbacks(STREAMFILE* sf, ov_callbacks* cal vgmstream->coding_type = coding_OGG_VORBIS; vgmstream->layout_type = layout_none; vgmstream->meta_type = ovmi->meta_type; + if (!vgmstream->meta_type) + vgmstream->meta_type = meta_OGG_VORBIS; vgmstream->sample_rate = sample_rate; vgmstream->stream_size = stream_size; diff --git a/src/meta/ogv_3rdeye.c b/src/meta/ogv_3rdeye.c new file mode 100644 index 00000000..9a930e58 --- /dev/null +++ b/src/meta/ogv_3rdeye.c @@ -0,0 +1,40 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* OGV - .ogg container (not related to ogv video) [Bloody Rondo (PC)] */ +VGMSTREAM* init_vgmstream_ogv_3rdeye(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + off_t subfile_offset, subfile_size; + + + /* checks */ + if (!check_extensions(sf,"ogv")) + goto fail; + if (!is_id32be(0x00,sf, "OGV\0")) + goto fail; + + /* 0x04: PCM size */ + subfile_size = read_u32le(0x08, sf); + /* 0x0c: "fmt" + RIFF fmt + "data" (w/ PCM size too) */ + subfile_offset = 0x2c; + + /* no loops (files bgm does full loops but sfx doesn't) */ + +#ifdef VGM_USE_VORBIS + { + ogg_vorbis_meta_info_t ovmi = {0}; + + ovmi.meta_type = meta_OGV_3RDEYE; + ovmi.stream_size = subfile_size; + + vgmstream = init_vgmstream_ogg_vorbis_callbacks(sf, NULL, subfile_offset, &ovmi); + } +#else + goto fail; +#endif + + return vgmstream; +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/src/vgmstream.c b/src/vgmstream.c index d9e44d1c..9ce9ed74 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -526,6 +526,7 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = { init_vgmstream_tac, init_vgmstream_idsp_tose, init_vgmstream_dsp_kwa, + init_vgmstream_ogv_3rdeye, /* lowest priority metas (should go after all metas, and TXTH should go before raw formats) */ init_vgmstream_txth, /* proper parsers should supersede TXTH, once added */ diff --git a/src/vgmstream.h b/src/vgmstream.h index a8eb0f1d..f1d84012 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -759,6 +759,7 @@ typedef enum { meta_TAC, meta_IDSP_TOSE, meta_DSP_KWA, + meta_OGV_3RDEYE, } meta_t; /* standard WAVEFORMATEXTENSIBLE speaker positions */