Header: XVAG
example:
Need decoder or converter.
one .xvag file from uncharted drake`s fortune.
Important information: this site is currently scheduled to go offline indefinitely by end of the year.
PS3 .xvag files
-
- mega-veteran
- Posts: 315
- Joined: Fri Jun 11, 2010 12:08 pm
- Has thanked: 78 times
- Been thanked: 23 times
-
- mega-veteran
- Posts: 315
- Joined: Fri Jun 11, 2010 12:08 pm
- Has thanked: 78 times
- Been thanked: 23 times
-
- beginner
- Posts: 23
- Joined: Fri Dec 19, 2008 7:25 pm
- Has thanked: 1 time
Re: PS3 .xvag files
Please i need help. I want to rip all god of wars 3 movies but it audio is in xvag but i cant use vgmstream. It dont works.
Any Help.
Any Help.
-
- advanced
- Posts: 45
- Joined: Tue Jan 27, 2009 5:00 pm
- Has thanked: 12 times
- Been thanked: 24 times
Re: PS3 .xvag files
vgmstream needs some external .dll files. Check the readme for download location and installation instructions.stephanehl wrote:Please i need help. I want to rip all god of wars 3 movies but it audio is in xvag but i cant use vgmstream. It dont works.
Any Help.
-
- mega-veteran
- Posts: 195
- Joined: Sat Dec 08, 2012 11:14 am
- Has thanked: 31 times
- Been thanked: 4 times
Re: PS3 .xvag files
Hi
it's work's for me with xvag header but i have .dat file get vag header not working
any idea please thank's
another trouble more important i get multichanel file not readable i can add cmd ligne ? maybie
it's work's for me with xvag header but i have .dat file get vag header not working
any idea please thank's
another trouble more important i get multichanel file not readable i can add cmd ligne ? maybie
-
- mega-veteran
- Posts: 315
- Joined: Fri Jun 11, 2010 12:08 pm
- Has thanked: 78 times
- Been thanked: 23 times
Re: PS3 .xvag files
Found a little problem - in some games .xvag is mp3s, but with pieces, which need deinterlave or delete. (but program, which I try, detect 2 channels only, dont know this real 2 channels or not)
I try use AlphaTwentyThree script - viewtopic.php?f=13&p=39344#p39344 - but, I cant set right parameters for it and dont understand how change RES parameter in script.
Files for testing can be send throught PM.
I try use AlphaTwentyThree script - viewtopic.php?f=13&p=39344#p39344 - but, I cant set right parameters for it and dont understand how change RES parameter in script.
Files for testing can be send throught PM.
-
- mega-veteran
- Posts: 315
- Joined: Fri Jun 11, 2010 12:08 pm
- Has thanked: 78 times
- Been thanked: 23 times
Re: PS3 .xvag files
Little explanation - I dont know method for deinterlave xvag files, so if anyone knows how it did, will be very thanksful.
-
- mega-veteran
- Posts: 315
- Joined: Fri Jun 11, 2010 12:08 pm
- Has thanked: 78 times
- Been thanked: 23 times
Re: PS3 .xvag files
Found one way to deinterlave .xvag files:
Source - viewtopic.php?f=17&t=8569
header - 133, interleave - 3000, layers - 2
So as the game has much music files (over 558), audio batch tool which can split two stereo files in one stereo file with saving original audio data(256, 2, 48000) is very actual. I try to find, but without success.
Source - viewtopic.php?f=17&t=8569
About interleave value finding:First, you need to find out the distance between each FFFB flag.
Then take that number and just keep multiplying it by 1, 2, 3 in a hex calculator until you find the correct interleave.
For example, let's say the distance between two FFFB flags is 0x300 or 768 bytes
300 x 1 = 300
300 x 2 = 600
300 x 3 = 900
Works with The Last of Us:Well, initially I just kept guessing and trying every number by adding or subtracting 0x300 to the number that didn't work (I started at 3000). But I just figured out an easier way. Keep looking at the contents of every frame (what's in between the FFFB values) and notice any patterns (usually, in the beginning, it's one repeated ascii character). Keep counting the frames, and when you see the pattern change, remember the number of that frame. Convert that number to hex, then multiply 0x300 by that number. (Here's a hex calculator: http://www.squarebox.co.uk/hcalc.html) So if the number you counted was 16, the interleave would be 3000. If you get it wrong, try adding 0x300 or subtracting 0x300. If it still doesn't work, look at the patterns more carefully.
Oh, and btw, the frame value is the address of the character that's before the first frame (for example, if the first frame starts with 11 00 FF FB D4, the frame value would be the address of the 00)
header - 133, interleave - 3000, layers - 2
So as the game has much music files (over 558), audio batch tool which can split two stereo files in one stereo file with saving original audio data(256, 2, 48000) is very actual. I try to find, but without success.
-
- ultra-veteran
- Posts: 389
- Joined: Thu Aug 12, 2010 8:15 am
- Has thanked: 54 times
- Been thanked: 93 times
TUTORIAL: Deinterleave A Multichannel MPEG XVAG File
You will need:
A hex editor of your choice
QuickBMS
AlphaTwentyThree's Deinterleave Script
VGMStream
VGMStream's External DLLs
Run your hex editor, and open up the XVAG file you wish to deinterleave.
The size of the header can be found at offset 0x06.
The picture below shows the header highlighted
In this example shown, the header size is 0x1B4. Not all XVAG files have the same header size. But you can usually work out the header just by looking at it. The header ends when the first MPEG flag (FF FB) is shown.
I think the header size varies depending on how many channels the file has.
Most 4 channel files have a header of 0x134, 6 channel files usually have a header of 0x154, 8 channels usually have a header size of 0x174, 10 channels usually have a header size of 0x194 and 12 channels (like the picture shown above) usually have a header size of 0x1B4. It seems to increment an additional 0x20 bytes for every additional two channels above 4.
After you have identified the size of the header, edit the deinterleave script to match. So in this example from the picture posted above the script would look like:
Now we have to work out the size of a single interleave block.
To work out the size of a single interleave block:
1. Go to the very end of the file in your hex editor. It should be a block of 00s
(NOTE: If there is no block of 00s and just a block of FFs, instead calculate the BLOCKSIZE by working out how many bytes are inbetween each MPEG flag (FF FB) starting just after the header and then keep multiplying it by 1, 2, 3 and adjusting the script until you get the correct interleave. The first two bytes after the header should be FF FB)
2. Select and highlight all of the data from the last 00 in the file all the way up until you reach another block of 00s (Your highlighted data should start with FF FB and end with the last 00 of the file) then copy and paste this into a new file in your hex editor.
3. Scroll down to the bottom of the newly created file and click after the final 00. The offset number given (highlighted in the red box) will represent a single interleave block for that file.
This will give you the INTSIZE for AlphaTwentyThree's script to successfully deinterleave the file.
From the example picture shown above, the INTSIZE is 2700 so now we add that number to the script:
NOTE: If the XVAG file block you have does not end on a round number, then use the exact offset of the single interleave block.
Now we have to work out how many layers the file has. This can be done two different ways. The first is to look at the header of the file and determine how many channels the file uses and then divide that number by two. You can usually find the number of channels at offset 0x2B.
In this example shown above, we’re given the hex number “0C” which when converted from hex to decimal becomes 12. Then we divide 12 by 2 and get 6.
Or you can go to the very end of the file, scroll up and count how many blocks of 00s there are. The number you are given is the number of layers the file has which in this example gives me 6 separate blocks of 00s.
Depending on which method you choose, after you have found the number of layers, edit the script to match it. For this example, I am setting it to 6.
After all that, this is what the options in the BMS script looks like.
Then run QuickBMS, select the file deinterleave script, choose the XVAG file you wish to deinterleave and then select an output directory.
After the script has finished, use VGMStream's test.exe to convert the deinterleaved XVAGs to WAV.
A hex editor of your choice
QuickBMS
AlphaTwentyThree's Deinterleave Script
VGMStream
VGMStream's External DLLs
Run your hex editor, and open up the XVAG file you wish to deinterleave.
The size of the header can be found at offset 0x06.
The picture below shows the header highlighted
In this example shown, the header size is 0x1B4. Not all XVAG files have the same header size. But you can usually work out the header just by looking at it. The header ends when the first MPEG flag (FF FB) is shown.
I think the header size varies depending on how many channels the file has.
Most 4 channel files have a header of 0x134, 6 channel files usually have a header of 0x154, 8 channels usually have a header size of 0x174, 10 channels usually have a header size of 0x194 and 12 channels (like the picture shown above) usually have a header size of 0x1B4. It seems to increment an additional 0x20 bytes for every additional two channels above 4.
After you have identified the size of the header, edit the deinterleave script to match. So in this example from the picture posted above the script would look like:
Code: Select all
set HEADER 0x1B4 # zero if skip is at end of block, otherwise = first skip at start
Now we have to work out the size of a single interleave block.
To work out the size of a single interleave block:
1. Go to the very end of the file in your hex editor. It should be a block of 00s
(NOTE: If there is no block of 00s and just a block of FFs, instead calculate the BLOCKSIZE by working out how many bytes are inbetween each MPEG flag (FF FB) starting just after the header and then keep multiplying it by 1, 2, 3 and adjusting the script until you get the correct interleave. The first two bytes after the header should be FF FB)
2. Select and highlight all of the data from the last 00 in the file all the way up until you reach another block of 00s (Your highlighted data should start with FF FB and end with the last 00 of the file) then copy and paste this into a new file in your hex editor.
3. Scroll down to the bottom of the newly created file and click after the final 00. The offset number given (highlighted in the red box) will represent a single interleave block for that file.
This will give you the INTSIZE for AlphaTwentyThree's script to successfully deinterleave the file.
From the example picture shown above, the INTSIZE is 2700 so now we add that number to the script:
Code: Select all
set INTSIZE 0x2700 # size of one single interleave block. Set Blocksize to zero to take this value instead.
Now we have to work out how many layers the file has. This can be done two different ways. The first is to look at the header of the file and determine how many channels the file uses and then divide that number by two. You can usually find the number of channels at offset 0x2B.
In this example shown above, we’re given the hex number “0C” which when converted from hex to decimal becomes 12. Then we divide 12 by 2 and get 6.
Or you can go to the very end of the file, scroll up and count how many blocks of 00s there are. The number you are given is the number of layers the file has which in this example gives me 6 separate blocks of 00s.
Depending on which method you choose, after you have found the number of layers, edit the script to match it. For this example, I am setting it to 6.
Code: Select all
set LAYERS 6
After all that, this is what the options in the BMS script looks like.
Code: Select all
set HEADER 0x1B4 # zero if skip is at end of block, otherwise = first skip at start
set PRESERVE 1
set ADJUST 0
set BLOCKSIZE 0 # size of one complete block
set INTSIZE 0x2700 # size of one single interleave block. Set Blocksize to zero to take this value instead.
set LAYERS 6
set SKIP 0 # area at start of each block to skip
Then run QuickBMS, select the file deinterleave script, choose the XVAG file you wish to deinterleave and then select an output directory.
After the script has finished, use VGMStream's test.exe to convert the deinterleaved XVAGs to WAV.
Last edited by brendan19 on Tue Mar 17, 2015 12:38 pm, edited 8 times in total.
-
- mega-veteran
- Posts: 315
- Joined: Fri Jun 11, 2010 12:08 pm
- Has thanked: 78 times
- Been thanked: 23 times
Re: PS3 .xvag files
I try your method, but I dont understand how need modify AlphaTwentyThree's script for work:
Then I just start it:
I get 0 byte files.
I get also with it:
And then I just put values of header and interleave block(layers I dont change) I got clicks and other undecoded things.
Then I just start it:
Code: Select all
set HEADER 0x133 # zero if skip is at end of block, otherwise = first skip at start
set PRESERVE 1
set ADJUST 0
set BLOCKSIZE 0 # size of one complete block
set INTSIZE 0x1800 # size of one single interleave block. Set Blocksize to zero to take this value instead.
set LAYERS 2
set SKIP 0 # area at start of each block to skip
I get also with it:
Code: Select all
set HEADER 0x133 # zero if skip is at end of block, otherwise = first skip at start
set PRESERVE 1
set ADJUST 0
set BLOCKSIZE 0 # size of one complete block
set INTSIZE 0x1800 # size of one single interleave block. Set Blocksize to zero to take this value instead.
set LAYERS 2
set SKIP 0 # area at start of each block to skip
set JUMP INTERL
math JUMP *= LAYERS # JUMP = size of one block
math INTERL -= SKIP
get TEST asize
math TEST %= LAYERS
if TEST != 0
print "Illegal deinterleave parameters! Aborting..."
cleanexit
endif
get CYCLES asize
math CYCLES /= JUMP # number of interleave blocks
get RES asize
math RES %= JUMP # size of last interleave block
#print "residuum: %RES%"
math RES /= LAYERS # size of single last interleave
if RES != 0
print "Warning: last block is incomplete! Check your parameters!"
endif
for i = 1 <= LAYERS
log MEMORY_FILE 0 0
set OFFSET i
math OFFSET -= 1
math OFFSET *= INTERL
math OFFSET += HEADER
append
for k = 1 <= CYCLES
log MEMORY_FILE OFFSET INTERL
math OFFSET += JUMP
math OFFET += SKIP
NEXT k
if RES != 0 # incomplete but valid last block
set OFF i
math OFF -= 1
math OFF *= RES
math OFFSET -= JUMP
math OFFSET -= SKIP
math OFFSET += OFF
log MEMORY_FILE OFFSET RES
endif
append
get SIZE asize MEMORY_FILE
get NAME basename
if LAYERS != 1
string NAME += "_"
string NAME += i
endif
log NAME 0 SIZE MEMORY_FILE
next i
-
- mega-veteran
- Posts: 315
- Joined: Fri Jun 11, 2010 12:08 pm
- Has thanked: 78 times
- Been thanked: 23 times
Re: PS3 .xvag files
Modified Alpha's deinterlave script, which works without problems(thanks to brendan19):
Batch tool for aumatic splitting two or more WAV\MP3(256, stereo, 48000) into one(explanation - result must have, for example, 3:04 time as two source files, and not 6:08) is actual yet.
Code: Select all
# deinterleave file by different parameters
# (c) 2012-09-05 by AlphaTwentyThree of XeNTaX
# notes:
# HEADER - area which is untouched by the deinterleaving
# PRESERVE 0/1 - set to 1 to write the skipped area from
# HEADER to each deinterleaved file
# ADJUST 0/1 - if the header needs to be adjusted, set
# this to 1 and write your code to the function
# "adjustheader" at the end of this script
# BLOCKSIZE - size of one complete interleave block
# INTSIZE - size of a single interleave block (set blocksize to zero to take this value)
# LAYERS - the numbers of (equal-sized) files you want
# to deinterleave to
# SKIP - number of bytes to skip at the start of each block
#
# examples:
# split channels of stereo wave file: # HEADER 0x2c, PRESERVE 1, ADJUST 1 (adjust function), BLOCKSIZE 4, LAYERS 2, SKIP 0
# leave out 2 bytes each 0x10 bytes: # BLOCKSIZE 0x10, LAYERS 1, SKIP 2
# split channels of Playstation ADPCM file: # HEADER 0x2c, PRESERVE 1, ADJUST 1 (adjust function), BLOCKSIZE 2*Interleave, SKIP 0
set HEADER 0x1B4 # zero if skip is at end of block, otherwise = first skip at start
set PRESERVE 1
set ADJUST 0
set BLOCKSIZE 0 # size of one complete block
set INTSIZE 0x2700 # size of one single interleave block. Set Blocksize to zero to take this value instead.
set LAYERS 6
set SKIP 0 # area at start of each block to skip
if BLOCKSIZE == 0
set BLOCKSIZE INTSIZE
math BLOCKSIZE *= LAYERS
math BLOCKSIZE += SKIP
endif
callfunction testparameters 1
get EXT extension
set WSIZE BLOCKSIZE
math WSIZE -= SKIP
math WSIZE /= LAYERS # data to write: (BLOCKSIZE - SKIP)/LAYERS
get CYCLES asize
math CYCLES -= HEADER
math CYCLES /= BLOCKSIZE
if LAYERS == 1
callfunction desingle # for faster running time
else
callfunction demulti
endif
startfunction testparameters
# test 1: (BLOCKSIZE-SKIP)/LAYERS must be integer (one block must be dividable into skip and layers)
set TEST BLOCKSIZE
math TEST -= SKIP
math TEST %= LAYERS # single layer -> always ok
if TEST != 0
print "Error: blocksize minus skip isn't dividable by layer count! Aborting..."
cleanexit
endif
# test 2: (ASIZE-HEADER)/BLOCKSIZE must be integer (no incomplete blocks at end)
get TEST asize
math TEST -= HEADER
math TEST %= BLOCKSIZE
if TEST != 0
print "Error: file size minus header isn't dividable by blocksize! Aborting..."
cleanexit
endif
# test 3: ASIZE-HEADER-BLOCKSIZE must be greater null (at least one deinterleave cycle)
get TEST asize
math TEST -= HEADER
math TEST -= BLOCKSIZE
if FSIZE <= 0
print "Error: file too small to deinterleave! Aborting..."
cleanexit
endif
endfunction
startfunction desingle
set PSIZE CYCLES
math PSIZE *= WSIZE
get NAME basename
string NAME += ".stripped"
if PRESERVE == 1
math PSIZE += HEADER
string NAME += "."
string NAME += EXT
endif
putVarChr MEMORY_FILE PSIZE 0
log MEMORY_FILE 0 0
if PRESERVE == 1
goto 0
getDstring HDATA HEADER
putDstring HDATA HEADER MEMORY_FILE
endif
goto HEADER
for i = 1 <= CYCLES
getDstring DUMMY SKIP
getDstring WDATA WSIZE
putDstring WDATA WSIZE MEMORY_FILE
math OFFSET += WSIZE # set OFFSET to current cursor (WDATA + SKIP = BLOCKSIZE)
next i
get SIZE asize MEMORY_FILE
if ADJUST == 1
callfunction adjustheader 1
endif
log NAME 0 SIZE MEMORY_FILE
endfunction
startfunction demulti
set PSIZE CYCLES
math PSIZE *= WSIZE
if PRESERVE == 1
math PSIZE += HEADER
goto 0
getDstring HDATA HEADER
endif
for i = 1 <= LAYERS
putVarChr MEMORY_FILE PSIZE 0
log MEMORY_FILE 0 0
get NAME basename
string NAME += "_"
string NAME += i
if PRESERVE == 1
putDstring HDATA HEADER MEMORY_FILE
string NAME += "."
string NAME += EXT
endif
set BIAS_A i
math BIAS_A -= 1
math BIAS_A *= WSIZE
math BIAS_A += SKIP # bias at start
set BIAS_B BLOCKSIZE
math BIAS_B -= BIAS_A
math BIAS_B -= WSIZE # bias at end
goto HEADER
for k = 1 <= CYCLES
getDstring DUMMY BIAS_A
getDstring WDATA WSIZE
putDstring WDATA WSIZE MEMORY_FILE
getDstring DUMMY BIAS_B
next k
get SIZE asize MEMORY_FILE
if ADJUST == 1
callfunction adjustheader 1
endif
log NAME 0 SIZE MEMORY_FILE
next i
endfunction
startfunction adjustheader # adjust this according to your needs
putVarChr MEMORY_FILE 4 1 long
get SSIZE asize MEMORY_FILE
math SSIZE -= HEADER
putVarChr MEMORY_FILE 0x10 SSIZE long
endfunction