Posts Tagged ‘mtdt’

Support for Sony PSP format in MP4::Info

Tuesday, February 27th, 2007

Today I opened a new feature request (http://rt.cpan.org/Ticket/Display.html?id=25178) on MP4::Info perl module to include my patch to read the title in a Sony PSP files. Read this post to know more about the way title is encoded in PSP Mp4 files. With the following patch mp4infopatch.txt (applied to Info.pm) you can read the title of an PSP MP4 file using the following code snippet:

use MP4::Info;
        my $file = 'MAQ12033.MP4';
 
        my $tag = get_mp4tag($file) or die "No TAG info";
        printf "$file title is %s\n", $tag->{NAM};
 
        my $info = get_mp4info($file);
        printf "$file title is %s\n", $info->{NAM};
 
        my $mp4 = new MP4::Info $file;
        printf "$file title is %s\n", $mp4->title;

UPDATE: Jonathan Harris has released a new version of MP4::Info with support for Sony’s PSP files. more info

Example of title encoded in a Sony PSP MP4 file

Sunday, February 25th, 2007

Here I included an example of a custom uuid USMT->MTDT block in a Sony PSP MP4 file

06A55450   75 75 69 64  55 53 4D 54  21 D2 4F CE  BB 88 69 5C  uuidUSMT!.O...i\
06A55460   FA C9 C7 40  00 00 00 90  4D 54 44 54  00 04 00 0C  ...@....MTDT....
06A55470   00 00 00 0B  55 C4 00 00  02 1C 00 22  00 00 00 04  ....U......"....
06A55480   15 C7 00 01  00 50 00 53  00 50 00 20  00 56 00 69  .....P.S.P. .V.i
06A55490   00 64 00 65  00 6F 00 20  00 39 00 00  00 26 00 00  .d.e.o. .9...&..
06A554A0   00 01 2A 0E  00 01 00 54  00 68 00 65  00 20 00 67  ..*....T.h.e. .g
06A554B0   00 6F 00 64  00 66 00 61  00 74 00 68  00 65 00 72  .o.d.f.a.t.h.e.r
06A554C0   00 00 00 32  00 00 00 03  55 C4 00 01  00 32 00 30  ...2....U....2.0
06A554D0   00 30 00 37  00 2F 00 30  00 32 00 2F  00 32 00 33  .0.7./.0.2./.2.3
06A554E0   00 20 00 32  00 30 00 3A  00 33 00 31  00 3A 00 33  . .2.0.:.3.1.:.3
06A554F0   00 34 00 00                                         .4..

The title “The godfather” is encoded in UTF-16 at position 06A554A7. To know a little bit more about the Sony PSP way of storing titles read this.

How to read title in Sony PSP MP4 files

Sunday, February 25th, 2007

If you had tried to read the title of a Sony PSP MP4 file with Ruby’s mp4info or Perl’s MP4::Info you probably noticed that the title is not stored in the NAM tag where it should be. Those two libraries cannot access the title info in Sony PSP files because title info is stored in a propierary way in a custom uuid atom called USMT. Inside this atom there is the MTDT meta info block and inside this block you can find the title. I found all this information in the movenc.c file from ffmpeg

+/*********
+
+     PSP USMT->MTDT meta info block format  (some guessing)
+     
+        - Note that clips play fine without this block.
+     
+     int32    : size of MTDT block
+     char[4]  : "MTDT"
+     int16    : Number of sub-data blocks (payloads)
+                    0x0001 EOT markers have 1 block
+                    0x0004 is the most I've seen in an information block (title, date, etc)
+     
+     Some number of data blocks, which take the form of:
+     
+        int16   : size of sub-data block
+        int32   : block type ID  (possibly 2 int16s:  unk & type )
+                    0x01 = Title
+                    0x03 = Timestamp (date format = "+%Y-%m-%d %k:%M:%S")
+                    0x04 = Creator Name
+                    0x0A = End of Track Marker
+                    0x0B = UNKNOWN (appears in info MTDT blocks)
+        int16   : ?flags? - generally 0x55c4 or 0x15c7, seen 0x2a0e, possibly font or language?)
+                    - Timestamp seems to always have 0x55c4
+        int16   : type of payload that follows?  (int, string, etc..?)
+                    - Unicode strings have 0x0001
+                    - short[] data has 0x0000
+        data[]  : Payload (strings are UTF16-BE short[] with 0x0000 terminator)
+        
+        
+        BLOCK IDs
+        
+           0x000A - Appear at end of tracks
+                
+                - flags always = 0x55c4
+                - Payload looks like: 0x0000 0x0100 0x0000 0x0000
+                
+           0x000B - Appears in meta data
+                - Payload looks like: 0x0000 0x?????  
+                - (0x???? probably flags- seen 0x1c02, 0x5cfe.  Maybe something with aspect ratio or frame rate?)
+        
+********/

Currently neither mp4info nor MP4::Info are capable of decoding this USMT->MTDT block. I’m looking into MP4::Info in order to add support for it. I will post something here if I got it working.UPDATE: I got it working read post