From f5750ba2ccfa80d8f86f283d7fcddbf4b401d2df Mon Sep 17 00:00:00 2001 From: bnnm Date: Fri, 13 Jan 2017 23:47:52 +0100 Subject: [PATCH] Moved make_riff_x to ffmpeg_decoder.c (only actually used by FFmpeg) Also added make_riff_xma2_from_fmt_be --- src/coding/coding.h | 5 + src/coding/ffmpeg_decoder.c | 203 ++++++++++++++++++++++++++++++++++++ src/header.c | 129 ----------------------- src/header.h | 5 - src/meta/fsb.c | 2 +- src/meta/ps3_vawx.c | 21 ++-- src/meta/x360.c | 11 +- 7 files changed, 223 insertions(+), 153 deletions(-) diff --git a/src/coding/coding.h b/src/coding/coding.h index 69587b3e..7480b5f2 100644 --- a/src/coding/coding.h +++ b/src/coding/coding.h @@ -145,6 +145,11 @@ void decode_at3plus(VGMSTREAM *vgmstream, sample * outbuf, int channelspacing, i void decode_ffmpeg(VGMSTREAM *stream, sample * outbuf, int32_t samples_to_do, int channels); void reset_ffmpeg(VGMSTREAM *vgmstream); void seek_ffmpeg(VGMSTREAM *vgmstream, int32_t num_sample); + +int ffmpeg_make_riff_atrac3(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_align, int joint_stereo, int encoder_delay); +int ffmpeg_make_riff_xma2(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_count, int block_size); +int ffmpeg_make_riff_xma2_from_fmt_be(uint8_t * buf, size_t buf_size, off_t fmt_offset, size_t fmt_size, size_t data_size, STREAMFILE *streamFile); + #endif #endif /*_CODING_H*/ diff --git a/src/coding/ffmpeg_decoder.c b/src/coding/ffmpeg_decoder.c index 7f7a6c0b..08db87fa 100644 --- a/src/coding/ffmpeg_decoder.c +++ b/src/coding/ffmpeg_decoder.c @@ -278,4 +278,207 @@ void seek_ffmpeg(VGMSTREAM *vgmstream, int32_t num_sample) { } + + +/* ******************************************** */ +/* FAKE RIFF HELPERS */ +/* ******************************************** */ +static int ffmpeg_fmt_chunk_swap_endian(uint8_t * chunk, uint16_t codec); +static int ffmpeg_make_riff_xma2_from_fmt(uint8_t * buf, size_t buf_size, off_t fmt_offset, size_t fmt_size, size_t data_size, STREAMFILE *streamFile, int big_endian); + +/** + * Copies a ATRAC3 riff to buf + * + * returns number of bytes in buf or -1 when buf is not big enough + */ +int ffmpeg_make_riff_atrac3(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_align, int joint_stereo, int encoder_delay) { + uint16_t codec_ATRAC3 = 0x0270; + size_t riff_size = 4+4+ 4 + 0x28 + 0x10 + 4+4; + + if (buf_size < riff_size) + return -1; + + memcpy(buf+0x00, "RIFF", 4); + put_32bitLE(buf+0x04, (int32_t)(riff_size-4-4 + data_size)); /* riff size */ + memcpy(buf+0x08, "WAVE", 4); + + memcpy(buf+0x0c, "fmt ", 4); + put_32bitLE(buf+0x10, 0x20);/*fmt size*/ + put_16bitLE(buf+0x14, codec_ATRAC3); + put_16bitLE(buf+0x16, channels); + put_32bitLE(buf+0x18, sample_rate); + put_32bitLE(buf+0x1c, sample_rate*channels / sizeof(sample)); /* average bytes per second (wrong) */ + put_32bitLE(buf+0x20, (int16_t)(block_align)); /* block align */ + + put_16bitLE(buf+0x24, 0x0e); /* extra data size */ + put_16bitLE(buf+0x26, 1); /* unknown, always 1 */ + put_16bitLE(buf+0x28, channels==1 ? 0x0800 : 0x1000); /* unknown (some size? 0x1000=2ch, 0x0800=1ch) */ + put_16bitLE(buf+0x2a, 0); /* unknown, always 0 */ + put_16bitLE(buf+0x2c, joint_stereo ? 0x0001 : 0x0000); + put_16bitLE(buf+0x2e, joint_stereo ? 0x0001 : 0x0000); /* repeated? */ + put_16bitLE(buf+0x30, 1); /* unknown, always 1 (frame_factor?) */ + put_16bitLE(buf+0x32, 0); /* unknown, always 0 */ + + memcpy(buf+0x34, "fact", 4); + put_32bitLE(buf+0x38, 0x8); /* fact size */ + put_32bitLE(buf+0x3c, sample_count); + put_32bitLE(buf+0x40, encoder_delay); + + memcpy(buf+0x44, "data", 4); + put_32bitLE(buf+0x48, data_size); /* data size */ + + return riff_size; +} + +/** + * Copies a XMA2 riff to buf + * + * returns number of bytes in buf or -1 when buf is not big enough + */ +int ffmpeg_make_riff_xma2(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_count, int block_size) { + uint16_t codec_XMA2 = 0x0166; + size_t riff_size = 4+4+ 4 + 0x3c + 4+4; + size_t bytecount; + uint32_t streams = 0; + uint32_t speakers = 0; /* see audiodefs.h */ + + if (buf_size < riff_size) + return -1; + + bytecount = sample_count * channels * sizeof(sample); + + /* untested (no support for > 2ch xma for now) */ + switch (channels) { + case 1: + streams = 1; + speakers = 0x00000004; /* FC */ + break; + case 2: + streams = 1; + speakers = 0x00000001 | 0x00000002; /* FL FR */ + break; + case 3: + streams = 3; + speakers = 0x00000001 | 0x00000002 | 0x00000004; /* FL FC FR */ + break; + case 4: + streams = 2; + speakers = 0x00000001 | 0x00000002 | 0x00000010 | 0x00000020; /* FL FR BL BR */ + break; + case 5: + streams = 3; + speakers = 0x00000001 | 0x00000002 | 0x00000010 | 0x00000020 | 0x00000004; /* FL C FR BL BR*/ + break; + case 6: + streams = 3; + speakers = 0x00000001 | 0x00000002 | 0x00000010 | 0x00000020 | 0x00000200 | 0x00000400; /* FL FR BL BR SL SR */ + break; + default: + streams = 1; + speakers = 0x80000000; + break; + } + + /*memset(buf,0, sizeof(uint8_t) * fmt_size);*/ + + memcpy(buf+0x00, "RIFF", 4); + put_32bitLE(buf+0x04, (int32_t)(riff_size-4-4 + data_size)); /* riff size */ + memcpy(buf+0x08, "WAVE", 4); + + memcpy(buf+0x0c, "fmt ", 4); + put_32bitLE(buf+0x10, 0x34);/*fmt size*/ + put_16bitLE(buf+0x14, codec_XMA2); + put_16bitLE(buf+0x16, channels); + put_32bitLE(buf+0x18, sample_rate); + put_32bitLE(buf+0x1c, sample_rate*channels / sizeof(sample)); /* average bytes per second (wrong) */ + put_16bitLE(buf+0x20, (int16_t)(channels*sizeof(sample))); /* block align */ + put_16bitLE(buf+0x22, sizeof(sample)*8); /* bits per sample */ + + put_16bitLE(buf+0x24, 0x22); /* extra data size */ + put_16bitLE(buf+0x26, streams); /* number of streams */ + put_32bitLE(buf+0x28, speakers); /* speaker position */ + put_32bitLE(buf+0x2c, bytecount); /* PCM samples */ + put_32bitLE(buf+0x30, block_size); /* XMA block size */ + /* (looping values not set, expected to be handled externally) */ + put_32bitLE(buf+0x34, 0); /* play begin */ + put_32bitLE(buf+0x38, 0); /* play length */ + put_32bitLE(buf+0x3c, 0); /* loop begin */ + put_32bitLE(buf+0x40, 0); /* loop length */ + put_8bit(buf+0x44, 0); /* loop count */ + put_8bit(buf+0x45, 4); /* encoder version */ + put_16bitLE(buf+0x46, block_count); /* blocks count = entried in seek table */ + + memcpy(buf+0x48, "data", 4); + put_32bitLE(buf+0x4c, data_size); /* data size */ + + return riff_size; +} + + +int ffmpeg_make_riff_xma2_from_fmt_be(uint8_t * buf, size_t buf_size, off_t fmt_offset, size_t fmt_size, size_t data_size, STREAMFILE *streamFile) { + return ffmpeg_make_riff_xma2_from_fmt(buf, buf_size, fmt_offset, fmt_size, data_size, streamFile, 1); +} +static int ffmpeg_make_riff_xma2_from_fmt(uint8_t * buf, size_t buf_size, off_t fmt_offset, size_t fmt_size, size_t data_size, STREAMFILE *streamFile, int big_endian) { + size_t riff_size = 4+4+ 4 + 4+4+fmt_size + 4+4; + uint8_t chunk[100]; + + if (buf_size < riff_size || fmt_size > 100) + goto fail; + if (read_streamfile(chunk,fmt_offset,fmt_size, streamFile) != fmt_size) + goto fail; + + if (big_endian) + ffmpeg_fmt_chunk_swap_endian(chunk, 0x166); + + memcpy(buf+0x00, "RIFF", 4); + put_32bitLE(buf+0x04, (int32_t)(riff_size-4-4 + data_size)); /* riff size */ + memcpy(buf+0x08, "WAVE", 4); + + memcpy(buf+0x0c, "fmt ", 4); + put_32bitLE(buf+0x10, fmt_size);/*fmt size*/ + memcpy(buf+0x14, chunk, fmt_size); + + memcpy(buf+0x14+fmt_size, "data", 4); + put_32bitLE(buf+0x14+fmt_size+4, data_size); /* data size */ + + return riff_size; + +fail: + return -1; +} + +/** + * Swaps endianness + * + * returns 0 on error + */ +static int ffmpeg_fmt_chunk_swap_endian(uint8_t * chunk, uint16_t codec) { + if (codec != 0x166) + goto fail; + + put_16bitLE(chunk + 0x00, get_16bitBE(chunk + 0x00));/*wFormatTag*/ + put_16bitLE(chunk + 0x02, get_16bitBE(chunk + 0x02));/*nChannels*/ + put_32bitLE(chunk + 0x04, get_32bitBE(chunk + 0x04));/*nSamplesPerSec*/ + put_32bitLE(chunk + 0x08, get_32bitBE(chunk + 0x08));/*nAvgBytesPerSec*/ + put_16bitLE(chunk + 0x0c, get_16bitBE(chunk + 0x0c));/*nBlockAlign*/ + put_16bitLE(chunk + 0x0e, get_16bitBE(chunk + 0x0e));/*wBitsPerSample*/ + put_16bitLE(chunk + 0x10, get_16bitBE(chunk + 0x10));/*cbSize*/ + put_16bitLE(chunk + 0x12, get_16bitBE(chunk + 0x12));/*NumStreams*/ + put_32bitLE(chunk + 0x14, get_32bitBE(chunk + 0x14));/*ChannelMask*/ + put_32bitLE(chunk + 0x18, get_32bitBE(chunk + 0x18));/*SamplesEncoded*/ + put_32bitLE(chunk + 0x1c, get_32bitBE(chunk + 0x1c));/*BytesPerBlock*/ + put_32bitLE(chunk + 0x20, get_32bitBE(chunk + 0x20));/*PlayBegin*/ + put_32bitLE(chunk + 0x24, get_32bitBE(chunk + 0x24));/*PlayLength*/ + put_32bitLE(chunk + 0x28, get_32bitBE(chunk + 0x28));/*LoopBegin*/ + put_32bitLE(chunk + 0x2c, get_32bitBE(chunk + 0x2c));/*LoopLength*/ + /* put_8bit(chunk + 0x30, get_8bit(chunk + 0x30));*//*LoopCount*/ + /* put_8bit(chunk + 0x31, get_8bit(chunk + 0x31));*//*EncoderVersion*/ + put_16bitLE(chunk + 0x32, get_16bitBE(chunk + 0x32));/*BlockCount*/ + + return 1; + +fail: + return 0; +} + #endif diff --git a/src/header.c b/src/header.c index 70fb0c63..f9a0561c 100644 --- a/src/header.c +++ b/src/header.c @@ -94,135 +94,6 @@ int header_open_stream(VGMSTREAM * vgmstream, STREAMFILE *streamFile, off_t star } -/** - * Copies a XMA2 riff to buf - * - * returns number of bytes in buf or -1 when buf is not big enough - */ -int header_make_riff_xma2(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_count, int block_size) { - uint16_t codec_XMA2 = 0x0166; - size_t riff_size = 4+4+ 4 + 0x3c + 4+4; - size_t bytecount; - uint32_t streams = 0; - uint32_t speakers = 0; /* see audiodefs.h */ - - if (buf_size < riff_size) - return -1; - - bytecount = sample_count * channels * sizeof(sample); - - /* untested (no support for > 2ch xma for now) */ - switch (channels) { - case 1: - streams = 1; - speakers = 0x00000004; /* FC */ - break; - case 2: - streams = 1; - speakers = 0x00000001 | 0x00000002; /* FL FR */ - break; - case 3: - streams = 3; - speakers = 0x00000001 | 0x00000002 | 0x00000004; /* FL FC FR */ - break; - case 4: - streams = 2; - speakers = 0x00000001 | 0x00000002 | 0x00000010 | 0x00000020; /* FL FR BL BR */ - break; - case 5: - streams = 3; - speakers = 0x00000001 | 0x00000002 | 0x00000010 | 0x00000020 | 0x00000004; /* FL C FR BL BR*/ - break; - case 6: - streams = 3; - speakers = 0x00000001 | 0x00000002 | 0x00000010 | 0x00000020 | 0x00000200 | 0x00000400; /* FL FR BL BR SL SR */ - break; - default: - streams = 1; - speakers = 0x80000000; - break; - } - - /*memset(buf,0, sizeof(uint8_t) * fmt_size);*/ - - memcpy(buf+0x00, "RIFF", 4); - put_32bitLE(buf+0x04, (int32_t)(riff_size-4-4 + data_size)); /* riff size */ - memcpy(buf+0x08, "WAVE", 4); - - memcpy(buf+0x0c, "fmt ", 4); - put_32bitLE(buf+0x10, 0x34);/*fmt size*/ - put_16bitLE(buf+0x14, codec_XMA2); - put_16bitLE(buf+0x16, channels); - put_32bitLE(buf+0x18, sample_rate); - put_32bitLE(buf+0x1c, sample_rate*channels / sizeof(sample)); /* average bytes per second (wrong) */ - put_16bitLE(buf+0x20, (int16_t)(channels*sizeof(sample))); /* block align */ - put_16bitLE(buf+0x22, sizeof(sample)*8); /* bits per sample */ - - put_16bitLE(buf+0x24, 0x22); /* extra data size */ - put_16bitLE(buf+0x26, streams); /* number of streams */ - put_32bitLE(buf+0x28, speakers); /* speaker position */ - put_32bitLE(buf+0x2c, bytecount); /* PCM samples */ - put_32bitLE(buf+0x30, block_size); /* XMA block size */ - /* (looping values not set, expected to be handled externally) */ - put_32bitLE(buf+0x34, 0); /* play begin */ - put_32bitLE(buf+0x38, 0); /* play length */ - put_32bitLE(buf+0x3c, 0); /* loop begin */ - put_32bitLE(buf+0x40, 0); /* loop length */ - put_8bit(buf+0x44, 0); /* loop count */ - put_8bit(buf+0x45, 4); /* encoder version */ - put_16bitLE(buf+0x46, block_count); /* blocks count = entried in seek table */ - - memcpy(buf+0x48, "data", 4); - put_32bitLE(buf+0x4c, data_size); /* data size */ - - return riff_size; -} - -/** - * Copies a ATRAC3 riff to buf - * - * returns number of bytes in buf or -1 when buf is not big enough - */ -int header_make_riff_atrac3(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_align, int joint_stereo, int encoder_delay) { - uint16_t codec_ATRAC3 = 0x0270; - size_t riff_size = 4+4+ 4 + 0x28 + 0x10 + 4+4; - - if (buf_size < riff_size) - return -1; - - memcpy(buf+0x00, "RIFF", 4); - put_32bitLE(buf+0x04, (int32_t)(riff_size-4-4 + data_size)); /* riff size */ - memcpy(buf+0x08, "WAVE", 4); - - memcpy(buf+0x0c, "fmt ", 4); - put_32bitLE(buf+0x10, 0x20);/*fmt size*/ - put_16bitLE(buf+0x14, codec_ATRAC3); - put_16bitLE(buf+0x16, channels); - put_32bitLE(buf+0x18, sample_rate); - put_32bitLE(buf+0x1c, sample_rate*channels / sizeof(sample)); /* average bytes per second (wrong) */ - put_32bitLE(buf+0x20, (int16_t)(block_align)); /* block align */ - - put_16bitLE(buf+0x24, 0x0e); /* extra data size */ - put_16bitLE(buf+0x26, 1); /* unknown, always 1 */ - put_16bitLE(buf+0x28, channels==1 ? 0x0800 : 0x1000); /* unknown (some size? 0x1000=2ch, 0x0800=1ch) */ - put_16bitLE(buf+0x2a, 0); /* unknown, always 0 */ - put_16bitLE(buf+0x2c, joint_stereo ? 0x0001 : 0x0000); - put_16bitLE(buf+0x2e, joint_stereo ? 0x0001 : 0x0000); /* repeated? */ - put_16bitLE(buf+0x30, 1); /* unknown, always 1 (frame_factor?) */ - put_16bitLE(buf+0x32, 0); /* unknown, always 0 */ - - memcpy(buf+0x34, "fact", 4); - put_32bitLE(buf+0x38, 0x8); /* fact size */ - put_32bitLE(buf+0x3c, sample_count); - put_32bitLE(buf+0x40, encoder_delay); - - memcpy(buf+0x44, "data", 4); - put_32bitLE(buf+0x48, data_size); /* data size */ - - return riff_size; -} - - /** * reads DSP coefs built in the streamfile */ diff --git a/src/header.h b/src/header.h index d6e14424..d2742398 100644 --- a/src/header.h +++ b/src/header.h @@ -14,11 +14,6 @@ int header_check_extensions(STREAMFILE *streamFile, const char * cmpexts); int header_open_stream(VGMSTREAM * vgmstream, STREAMFILE *streamFile, off_t start_offset); -int header_make_riff_xma2(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_count, int block_size);; - -int header_make_riff_atrac3(uint8_t * buf, size_t buf_size, size_t sample_count, size_t data_size, int channels, int sample_rate, int block_align, int joint_stereo, int encoder_delay); - void header_dsp_read_coefs_be(VGMSTREAM * vgmstream, STREAMFILE *streamFile, off_t offset, off_t spacing); - #endif /* _HEADER_H_ */ diff --git a/src/meta/fsb.c b/src/meta/fsb.c index fe1bed06..fe1c4348 100644 --- a/src/meta/fsb.c +++ b/src/meta/fsb.c @@ -330,7 +330,7 @@ VGMSTREAM * init_vgmstream_fsb_offset(STREAMFILE *streamFile, off_t offset) { block_count = fsbh.datasize / block_size; /* read_32bitLE(custom_data_offset +0x14) -1? */ /* make a fake riff so FFmpeg can parse the XMA2 */ - bytes = header_make_riff_xma2(buf, FAKE_RIFF_BUFFER_SIZE, fsbh.lengthsamples, fsbh.datasize, fsbh.numchannels, fsbh.deffreq, block_count, block_size); + bytes = ffmpeg_make_riff_xma2(buf, FAKE_RIFF_BUFFER_SIZE, fsbh.lengthsamples, fsbh.datasize, fsbh.numchannels, fsbh.deffreq, block_count, block_size); if (bytes <= 0) goto fail; diff --git a/src/meta/ps3_vawx.c b/src/meta/ps3_vawx.c index 4916d22e..4acb14f9 100644 --- a/src/meta/ps3_vawx.c +++ b/src/meta/ps3_vawx.c @@ -1,6 +1,7 @@ #include "meta.h" #include "../util.h" #include "../header.h" +#include "../coding/coding.h" #define FAKE_RIFF_BUFFER_SIZE 100 @@ -51,19 +52,17 @@ VGMSTREAM * init_vgmstream_vawx(STREAMFILE *streamFile) { break; #ifdef VGM_USE_FFMPEG - case 1: { /* XMA */ + case 1: { /* XMA2 */ ffmpeg_codec_data *ffmpeg_data = NULL; uint8_t buf[FAKE_RIFF_BUFFER_SIZE]; - size_t bytes, block_size, block_count; - /* not accurate but not needed by FFmpeg */ + int32_t bytes, block_size, block_count; + /* todo not accurate (needed for >2ch) */ datasize = get_streamfile_size(streamFile)-start_offset; block_size = 2048; block_count = datasize / block_size; /* read_32bitLE(custom_data_offset +0x14) -1? */ - /* make a fake riff so FFmpeg can parse the XMA2 */ - bytes = header_make_riff_xma2(buf, FAKE_RIFF_BUFFER_SIZE, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_count, block_size); - if (bytes <= 0) - goto fail; + bytes = ffmpeg_make_riff_xma2(buf, FAKE_RIFF_BUFFER_SIZE, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_count, block_size); + if (bytes <= 0) goto fail; ffmpeg_data = init_ffmpeg_header_offset(streamFile, buf,bytes, start_offset,datasize); if ( !ffmpeg_data ) goto fail; @@ -80,12 +79,10 @@ VGMSTREAM * init_vgmstream_vawx(STREAMFILE *streamFile) { case 7: { /* ATRAC3 */ ffmpeg_codec_data *ffmpeg_data = NULL; uint8_t buf[FAKE_RIFF_BUFFER_SIZE]; - size_t bytes, block_size, encoder_delay; - int joint_stereo; - int32_t max_samples; + int32_t bytes, block_size, encoder_delay, joint_stereo, max_samples; datasize = read_32bitBE(0x54,streamFile); - block_size = 0x98 * 2; + block_size = 0x98 * vgmstream->channels; joint_stereo = 0; max_samples = (datasize / block_size) * 1024; encoder_delay = 0x0; /* not used by FFmpeg */ @@ -95,7 +92,7 @@ VGMSTREAM * init_vgmstream_vawx(STREAMFILE *streamFile) { } /* make a fake riff so FFmpeg can parse the ATRAC3 */ - bytes = header_make_riff_atrac3(buf, FAKE_RIFF_BUFFER_SIZE, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_size, joint_stereo, encoder_delay); + bytes = ffmpeg_make_riff_atrac3(buf, FAKE_RIFF_BUFFER_SIZE, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_size, joint_stereo, encoder_delay); if (bytes <= 0) goto fail; diff --git a/src/meta/x360.c b/src/meta/x360.c index 66e39d4d..c75c11d6 100644 --- a/src/meta/x360.c +++ b/src/meta/x360.c @@ -1,5 +1,6 @@ #include "meta.h" #include "../header.h" +#include "../coding/coding.h" /* CXS - found in Eternal Sonata (Xbox 360) */ VGMSTREAM * init_vgmstream_x360_cxs(STREAMFILE *streamFile) { @@ -31,7 +32,6 @@ VGMSTREAM * init_vgmstream_x360_cxs(STREAMFILE *streamFile) { /* 0x1c: below */ vgmstream->meta_type = meta_X360_CXS; - vgmstream->layout_type = layout_none; #ifdef VGM_USE_FFMPEG { @@ -43,15 +43,14 @@ VGMSTREAM * init_vgmstream_x360_cxs(STREAMFILE *streamFile) { block_size = read_32bitBE(0x20,streamFile); datasize = read_32bitBE(0x24,streamFile); - /* make a fake riff so FFmpeg can parse the XMA2 */ - bytes = header_make_riff_xma2(buf,100, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_count, block_size); - if (bytes <= 0) - goto fail; + bytes = ffmpeg_make_riff_xma2(buf,100, vgmstream->num_samples, datasize, vgmstream->channels, vgmstream->sample_rate, block_count, block_size); + if (bytes <= 0) goto fail; + ffmpeg_data = init_ffmpeg_header_offset(streamFile, buf,bytes, start_offset,datasize); if ( !ffmpeg_data ) goto fail; - vgmstream->codec_data = ffmpeg_data; vgmstream->coding_type = coding_FFmpeg; + vgmstream->layout_type = layout_none; } #else goto fail;