diff --git a/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj b/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj index f113f07b7..21672b803 100644 --- a/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj +++ b/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj @@ -389,6 +389,7 @@ 83D731891A749D1500CA1366 /* g719.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D7313E1A74968A00CA1366 /* g719.framework */; }; 83D7318A1A749D2200CA1366 /* g719.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83D7313E1A74968A00CA1366 /* g719.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 83D7318C1A749EEE00CA1366 /* g719_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D7318B1A749EEE00CA1366 /* g719_decoder.c */; }; + 83E56BA51F2EE3520026BC60 /* vorbis_custom_utils_ogl.c in Sources */ = {isa = PBXBuildFile; fileRef = 83E56BA01F2EE3500026BC60 /* vorbis_custom_utils_ogl.c */; }; 83EDE5D81A70951A005F5D84 /* mca.c in Sources */ = {isa = PBXBuildFile; fileRef = 83EDE5D61A70951A005F5D84 /* mca.c */; }; 83EDE5D91A70951A005F5D84 /* btsnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 83EDE5D71A70951A005F5D84 /* btsnd.c */; }; 83F4129C1E93313C002E37D0 /* Vorbis.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83F4128F1E932F9A002E37D0 /* Vorbis.framework */; }; @@ -878,6 +879,7 @@ 83D730E51A738EB200CA1366 /* g7221.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = g7221.xcodeproj; path = ../g7221/g7221.xcodeproj; sourceTree = ""; }; 83D731381A74968900CA1366 /* g719.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = g719.xcodeproj; path = ../g719/g719.xcodeproj; sourceTree = ""; }; 83D7318B1A749EEE00CA1366 /* g719_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = g719_decoder.c; sourceTree = ""; }; + 83E56BA01F2EE3500026BC60 /* vorbis_custom_utils_ogl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vorbis_custom_utils_ogl.c; sourceTree = ""; }; 83EDE5D61A70951A005F5D84 /* mca.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mca.c; sourceTree = ""; }; 83EDE5D71A70951A005F5D84 /* btsnd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = btsnd.c; sourceTree = ""; }; 83F412871E932F9A002E37D0 /* Vorbis.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Vorbis.xcodeproj; path = ../Vorbis/macosx/Vorbis.xcodeproj; sourceTree = ""; }; @@ -1022,6 +1024,7 @@ 836F6DDF18BDC2180095E648 /* coding */ = { isa = PBXGroup; children = ( + 83E56BA01F2EE3500026BC60 /* vorbis_custom_utils_ogl.c */, 839E21D91F2EDAF000EE54D7 /* mpeg_custom_utils_ahx.c */, 839E21DD1F2EDAF000EE54D7 /* mpeg_custom_utils.c */, 839E21DE1F2EDAF000EE54D7 /* mpeg_decoder.h */, @@ -1593,6 +1596,7 @@ buildActionMask = 2147483647; files = ( 839E21E21F2EDAF100EE54D7 /* vorbis_custom_utils_wwise.c in Sources */, + 83E56BA51F2EE3520026BC60 /* vorbis_custom_utils_ogl.c in Sources */, 839E21E91F2EDAF100EE54D7 /* vorbis_custom_utils_sk.c in Sources */, 839E21E41F2EDAF100EE54D7 /* vorbis_custom_utils_fsb.c in Sources */, 839E21E11F2EDAF100EE54D7 /* vorbis_custom_decoder.c in Sources */, diff --git a/Frameworks/vgmstream/vgmstream/src/coding/vorbis_custom_utils_ogl.c b/Frameworks/vgmstream/vgmstream/src/coding/vorbis_custom_utils_ogl.c new file mode 100644 index 000000000..f75a912ff --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/coding/vorbis_custom_utils_ogl.c @@ -0,0 +1,77 @@ +#include "vorbis_custom_decoder.h" + +#ifdef VGM_USE_VORBIS +#include + + +/* **************************************************************************** */ +/* EXTERNAL API */ +/* **************************************************************************** */ + +/** + * OGL removes the Ogg layer and uses 16b packet headers, that have the size of the next packet, but + * the lower 2b need to be removed (usually 00 but 01 for the id packet, not sure about the meaning). + */ +int vorbis_custom_setup_init_ogl(STREAMFILE *streamFile, off_t start_offset, vorbis_custom_codec_data *data) { + off_t offset = start_offset; + size_t packet_size; + + /* read 3 packets with triad (id/comment/setup), each with an OGL header */ + + /* normal identificacion packet */ + packet_size = (uint16_t)read_16bitLE(offset, streamFile) >> 2; + if (packet_size > data->buffer_size) goto fail; + data->op.bytes = read_streamfile(data->buffer,offset+2,packet_size, streamFile); + if (vorbis_synthesis_headerin(&data->vi, &data->vc, &data->op) != 0) goto fail; /* parse identification header */ + offset += 2+packet_size; + + /* normal comment packet */ + packet_size = (uint16_t)read_16bitLE(offset, streamFile) >> 2; + if (packet_size > data->buffer_size) goto fail; + data->op.bytes = read_streamfile(data->buffer,offset+2,packet_size, streamFile); + if (vorbis_synthesis_headerin(&data->vi, &data->vc, &data->op) !=0 ) goto fail; /* parse comment header */ + offset += 2+packet_size; + + /* normal setup packet */ + packet_size = (uint16_t)read_16bitLE(offset, streamFile) >> 2; + if (packet_size > data->buffer_size) goto fail; + data->op.bytes = read_streamfile(data->buffer,offset+2,packet_size, streamFile); + if (vorbis_synthesis_headerin(&data->vi, &data->vc, &data->op) != 0) goto fail; /* parse setup header */ + offset += 2+packet_size; + + /* data starts after triad */ + data->config.data_start_offset = offset; + + return 1; + +fail: + return 0; +} + + +int vorbis_custom_parse_packet_ogl(VGMSTREAMCHANNEL *stream, vorbis_custom_codec_data *data) { + size_t bytes; + + /* get next packet size from the OGL 16b header (upper 14b) */ + data->op.bytes = (uint16_t)read_16bitLE(stream->offset, stream->streamfile) >> 2; + stream->offset += 2; + if (data->op.bytes == 0 || data->op.bytes == 0xFFFF) { + VGM_LOG("OGL Vorbis: wrong packet (0x%lx) @ %lx\n", data->op.bytes, stream->offset-2); + goto fail; /* EOF or end padding */ + } + + /* read raw block */ + bytes = read_streamfile(data->buffer,stream->offset, data->op.bytes,stream->streamfile); + stream->offset += data->op.bytes; + if (bytes != data->op.bytes) { + VGM_LOG("OGL Vorbis: wrong bytes (0x%lx) @ %lx\n", data->op.bytes, stream->offset-bytes); + goto fail; /* wrong packet? */ + } + + return 1; + +fail: + return 0; +} + +#endif